2017-07-18 1 views
0

So kann ich ein Bild zu Base64 konvertieren und dann die Bilddaten mit JSON Post, was sehr praktisch ist, etwa so:HTTP POST unformatierte Binärdaten mit Node.js und Browser, ohne form-data

curl -u "username:pwd" \ 
    -X PUT \ 
    -H "Content-Type: application/json" \ 
    -d '{"image":"my-base64-str-data"}' \ 
    http://maven.nabisco.com/artifactory/cdt-repo/folder/unique-image-id 

Meine Frage ist jedoch - gibt es eine Möglichkeit, die rohen binären Bilddaten zu senden, anstatt als base64 zu kodieren? Wie könnte man das mit cURL oder Node.js machen? Ist es möglich, eine Datei oder binäre Daten ohne Verwendung von Formulardaten in einer HTTP-Anfrage zu senden?

Am Ende des Tages möchte ich jedoch das Bild vom Browser POST, und in diesem Fall kann die Codierung des Bildes als Base64 der einzige Weg sein, zu gehen?

+0

Mögliches Duplikat von [Binärdaten in JSON String. Etwas besser als Base64] (https://stackoverflow.com/questions/1443158/binary-data-in-json-string-etwas-besser-besser-base64). Siehe die Antwort von @ Ælex. – cybersam

+0

nein, ich versuche nicht binäre Daten in JSON zu setzen, ich bin auf der Suche binäre in der Anfrage zu schreiben, und JSON insgesamt zu vermeiden –

Antwort

1

Locken

Wie man auf dem curl manpage, Uploads dieser Form getan werden durch Daten spezifiziert Strings lesen können, und kann direkt aus einer Datei mit --data-binary @/path/to/file Syntax erfolgen:

--data-binary <data> 
      (HTTP) This posts data exactly as specified with no extra processing whatsoever. 

      If you start the data with the letter @, the rest should be a filename. Data is 
      posted in a similar manner as --data-ascii does, except that newlines and car‐ 
      riage returns are preserved and conversions are never done. 

      If this option is used several times, the ones following the first will append 
      data as described in -d, --data. 

Wenn das Bild ist nur als Binär-String in Ihrer Sprache verfügbar, zum Beispiel als Node.js-Puffer, und Sie wollen nicht das Dateisystem treffen, dann müssen Sie es möglicherweise entgehen, indem Sie es in ' Zeichen einschließen und jedes ' Zeichen darin ersetzen der Saite mit einer entsprechenden Flucht Seq wie '\'' oder, wenn Sie sich unwohl fühlen, '"'"'. (Recall, dass echo 'abc'"def"'ghi' wird echo abcdefghi als eine einzige Einheit.)

Node.js

Knoten ist ein wenig mehr zu vergeben, weil es einen expliziten Puffertyp hat, aber es hat ein bisschen mehr Konstruktion erfordert, damit es funktioniert . Hier verpacke ich die Rückgabedaten in einem Promise, falls Sie es benötigen:

const http = require("http"); 
function upload(image_buffer, image_id) { 
    return new Promise((accept, reject) => { 
    let options = { 
     method: "PUT", 
     hostname: "maven.nabisco.com", 
     port: 80, 
     path: "/artifactory/cdt-repo/folder/" + image_id, 
     headers: { 
     "Content-Type": "application/octet-stream", 
     "Content-Length": image_buffer.length 
     } 
    }; 
    let data = []; 
    let request = http.request(options, response => { 
     response.on("data", chunk => data.push(chunk)); 
     response.on("end",() => 
     accept({ 
      headers: response.headers, 
      statusCode: response.statusCode, 
      data: Buffer.concat(data) 
     }) 
    ); 
    }); 
    request.on("error", err => reject(err)); 

    request.write(image_buffer); 
    request.end(); 
    }); 
} 
+0

genial Ich werde das versuchen - jede Idee, wie binäre Daten vom Browser an einen Server zu senden, ohne Formulardaten verwenden? das ist meine größte Frage - bisher konnte ich nur Formulardaten mit einer base64-Zeichenfolge verwenden, aber ich würde lieber ein Bild als rohe Binärdatei vom Browser an Artifactory senden. –

+0

yeah mit --data-binary funktioniert - aber wie ich schon sagte, ich würde gerne eine Möglichkeit finden, Binärdaten vom Browser an einen Server zu senden. –

+1

@AlexanderMills Versuchen Sie [MDN - Web-APIs - XMLHttpRequest - Senden und Empfangen von Binärdaten] (https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data). –