L'extraction des Données Binaires (une image jpeg) dans le Corps de la Requête Envoyée à un Node.js Serveur

Problème À Résoudre

Bonjour. J'ai reçu une application iPhone qui, en tant que partie de ses fonctionnalités, envoie une requête au serveur avec un fichier binaire d'image jpeg dans le corps de la requête. Je dois trouver un moyen de lire que des données binaires, l'envoyer à un client via socket.io, et le journal d'une copie de l'image sur le disque sur le serveur.

Premier Essai:

J'ai tenté quelques approches avec pas de chance. J'ai d'abord essayé ceci:

var http = require('http');
var fs = require('fs');

http.createServer(function (req, res) {
console.log("Request In");
    var body = '';
    req.on('data', function (data) {
        body += data;
    });
    req.on('end', function () {
        fs.writeFile("./1.jpeg", body, function(err) {
        if(err) {
            console.log(err);
           } else {
            console.log("The file was saved!");
     }
});
    });
res.writeHead(200, {'Content-Type':'text/plain'});
res.end('Image Saved!');
}).listen(3000);
console.log('Server running at http://127.0.0.1:3000/');

Cela n'a pas fonctionné. Je ne pouvais pas obtenir une image qui s'ouvre dans la Visionneuse de Photos Windows. La Visionneuse de Photos Windows m'a donné l'erreur Windows Photo Viewer can't open this picture because either Photo Viewer doesn't support this file format, or you don't have the latest updates to Photo Viewer je suis sûr d'avoir la dernière version. Ensuite, j'ai demandé si la demande a été prise en foiré entre le téléphone et le serveur.

Vérification De La Demande De La Fidélité

J'ai installé Fiddler 2. J'ai paramétré un proxy inverse, détaillé ici. J'ai cliqué sur la demande, puis est allé à l'hex. - Je enregistrer des octets d'après les informations d'en-tête en cliquant-droit sur la sélection économiser des octets. J'ai nommé le fichier test.jpg et il a ouvert dans la Visionneuse de Photos Windows bien.

L'extraction des Données Binaires (une image jpeg) dans le Corps de la Requête Envoyée à un Node.js Serveur

J'ai choisi quels octets pour enregistrer sur la base des différentes couleurs sur le "octets d'en-tête" et le "corps octets"

L'extraction des Données Binaires (une image jpeg) dans le Corps de la Requête Envoyée à un Node.js Serveur

Voici un exemple de l'image j'ai fini d'enregistrer ces octets

L'extraction des Données Binaires (une image jpeg) dans le Corps de la Requête Envoyée à un Node.js Serveur

Deuxième Essai:

Maintenant que je sais que l'image est dans le demande et que je sais que je peux obtenir à l'aide de fiddler, j'ai cherché sur stackoverflow et google pour trouver comment capturer le corps de la requête. J'ai essayé un tas de solutions, mais aucune ne m'a donné une image que je pouvais ouvrir.

//Express.js
var express = require('express');
var app = express();
var fs = require('fs');

app.configure(function(){
    app.use(express.bodyParser());
    app.use(function(req, res, next) {
        req.rawBody = '';
        //req.setEncoding('base64');
        req.setEncoding(null);
        req.on('data', function(chunk) { 
            req.rawBody += chunk;
        });
        req.on('end', function() {
            next();
        });
    });
});

app.listen(3000);

app.get('*', function(req, res){
    res.writeHead(200);
    res.end('Hello World');
    console.log(req.rawBody);
});

app.put('*',  function(req, res){
    console.log("putted");
    res.writeHead(200);
    res.end('Hello World');
    fs.writeFile("./1.jpg", req.rawBody, function(err) {
        if(err) {
            console.log(err);
        } else {
            console.log("The file was saved!");
        }
    });
    console.log(req.headers);
    console.log(req.params);
    console.log(req.body);
});
console.log("running");

Que je comprends, l'express bodyParser regarde pour les paires clé-valeur json et parce que le corps de la requête est juste un tas de données binaires, son retour un tableau vide/objet (pas sûr). J'ai écrit la coutume middleware qui ajoute une rawBody variable de l'objet de requête (req) à la suggestion de cette réponse sur stackoverflow. Quelques articles dit d'utiliser req.setEncoding('something') pour laisser le Node.js connaître la façon dont les données sont codées. J'ai essayé null base64 hex et binary.

J'ai téléchargé la demande enregistrée de Fiddler 2, si vous souhaitez prendre un coup d'oeil. Fiddler 2 Demande. Note: je n'étais pas sûr de ce que l'extension de fichier à utiliser, de sorte que je n'ai pas utilisé toute l'extension de fichier.

Je suis actuellement coincé. J'ai essayé toutes les solutions que j'ai pu trouver sur google et stackoverflow. Veuillez demander des précisions si vous en avez besoin. J'ai essayé d'être le plus détaillé possible (désolé pour la longueur). Merci d'avoir pris le temps de lire jusqu'ici!

Note De Côté/Extra

Je ne sais pas beaucoup sur Node.js tampons de travail. Je voudrais être en mesure d'accepter un "flux" de ces images si possible. Je ne sais pas comment un tampon pourrait jouer dans une réponse, mais si elle ne s'il vous plaît essayer de l'expliquer, en supposant que j'ai peu de connaissances sur les tampons.

Je l'ai dit également vouloir envoyer l'image à un navigateur plus de prise.io. Si vous souhaitez inclure ce second jeu dans votre réponse, il serait grandement apprécié.

Si vous le souhaitez, veuillez inclure des informations sur la façon dont votre solution. (Lourd sur le CPU ou mem ou d'une lumière, etc)

OriginalL'auteur anglinb | 2013-10-27