2017-07-24 2 views
-1

J'ai le code vanilla pour obtenir le corps d'une requête, mais il crée une chaîne. Jusqu'à présent, cela a bien fonctionné pour la plupart des choses, mais maintenant je veux recevoir un blob.Comment puis-je recevoir un blob avec Vanilla Node.js?

Tout d'abord, le code que j'ai maintenant:

http.createServer(function (request, response) { 
    var body = ''; 

    request.on('data', function (data) { 
    //this works great for UTF-8, but does not work for Blobs 
    body += data; 

    // Too much POST data, kill the connection! 
    // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB 
    if (body.length > 1e7) { 
     console.log("POSTED data too large!") 
     request.connection.destroy(); 
    } 
    }); 

    request.on('end', function() { 
    var pathname = "test.png"; 
    fs.writeFileSync(pathname, body, {flag: "w"}); 

    response.writeHead(200, { 
     'Content-Type': 'text/plain', 
     "Access-Control-Allow-Origin" : "*" 
    }); 
    response.end("got it") 
    }); 

}).listen(8888); 

côté client:

var imgNode; //assume is loaded <img> 
var canvas = document.createElement("canvas"); 
canvas.width = imgNode.naturalWidth; 
canvas.height = imgNode.naturalHeight; 
var ctx = canvas.getContext("2d"); 
ctx.drawImage(imgNode, 0, 0); 

canvas.toBlob(function(blob) { 
    Ajax.POST("localhost:8888", blob); //functional Ajax POST 
}); 

Le problème ici est que ce code ne fonctionne que pour les chaînes. Quel est le code Vanilla qui fonctionnerait pour Blobs?

+0

'ce code ne fonctionne que pour les chaînes' - que se passe-t-il lorsque vous essayez avec des blobs? quelle fin échoue? –

+0

Il crée une chaîne à la place d'un objet blob. –

+0

quel est le "ça" qui fait ça? –

Répondre

1

à l'aide Buffer au lieu d'un string devrait fonctionner, comme si

http.createServer(function (request, response) { 
    var body = Buffer.from([]); // create a buffer 

    request.on('data', function (data) { 
     // add to buffer 
     body = Buffer.concat([body,data]); 
     // Too much POST data, kill the connection! 
     // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB 
     if (body.length > 1e7) { 
      console.log("POSTED data too large!") 
      request.connection.destroy(); 
     } 
    }); 
    request.on('end', function() { 
     var pathname = "test.png"; 
     fs.writeFileSync(pathname, body, {flag: "w"}); 

     response.writeHead(200, { 
       'Content-Type': 'text/plain', 
       'Access-Control-Allow-Origin' : '*', 
       // note: I had to add these because of the OPTIONS request 
       'Access-Control-Allow-Headers' : 'Content-Type', 
       'Access-Control-Allow-Methods' : 'GET,PUT,POST,DELETE,OPTIONS' 
     }); 
     response.end("got it") 
    }); 

}).listen(8888); 

Quand j'ai essayé de tester votre code, je recevais un OPTIONS prévol - le code ci-dessus « poignées », mais c'est hacky au mieux - comme vous ne semblez pas avoir un contrôle en amont OPTIONS (parce que vous ne le manipulez pas dans votre code) je me dis que c'est juste quelque chose que j'ai mal fait avec votre code

Il y a probablement une bien meilleure façon d'ajouter les données à la mémoire tampon - Je n'ai pas fait des choses comme ça avec le noeud dans un certain temps

+0

Pour ce projet, je gère le contrôle en amont et le CORS général avec un abandon sauvage. Quant au tampon, merci! –

+0

ce code fonctionne très bien. La seule chose que je pense pourrait être utile de changer est l'instanciation du tampon. 'new Buffer()' a été déprécié à la place de 'Buffer.from ([])' https://nodejs.org/api/buffer.html#buffer_new_buffer_array –

+0

a changé le code, je ne savais pas qu'il était obsolète: p –