Ich habe Probleme beim Hochladen der Datei mithilfe der POST-Anforderung in Node.js. Ich muss ein request
Modul verwenden, um dies zu erreichen (keine externen npms). Der Server muss eine mehrteilige Anforderung mit dem file
Feld sein, das die Daten der Datei enthält. Was einfach zu sein scheint, ist in Node.js ziemlich schwierig, ohne ein externes Modul zu verwenden.
Ich habe versucht, dieses Beispiel zu verwenden, aber ohne Erfolg:
request.post({
uri: url,
method: 'POST',
multipart: [{
body: '<FILE_DATA>'
}]
}, function (err, resp, body) {
if (err) {
console.log('Error!');
} else {
console.log('URL: ' + body);
}
});
node.js
multipartform-data
http-post
Łukasz Jagodziński
quelle
quelle
enctype="multipart/form-data"
?Antworten:
Sieht so aus, als würden Sie bereits ein
request
Modul verwenden .In diesem Fall müssen Sie lediglich
multipart/form-data
die folgendeform
Funktion verwenden :var req = request.post(url, function (err, resp, body) { if (err) { console.log('Error!'); } else { console.log('URL: ' + body); } }); var form = req.form(); form.append('file', '<FILE_DATA>', { filename: 'myfile.txt', contentType: 'text/plain' });
Wenn Sie jedoch eine vorhandene Datei aus Ihrem Dateisystem veröffentlichen möchten, können Sie sie einfach als lesbaren Stream übergeben:
form.append('file', fs.createReadStream(filepath));
request
extrahiert alle zugehörigen Metadaten selbst.Weitere Informationen zum Posten finden
multipart/form-data
Sie imnode-form-data
Modul , das intern von verwendet wirdrequest
.quelle
post
Aufruf der Methode geändert werden konnte. In den Anforderungsdokumenten ist die Erklärung vergraben - das Formular " kann geändert werden, bis die Anforderung im nächsten Zyklus der Ereignisschleife ausgelöst wird ".req.form()
direkt nach dem Aufruf aufrufen und synchron mit allen entsprechenden Daten füllenrequest.post
. Es ist wichtig, dies während des gleichen Ereignisschleifen-Ticks zu tun, da Ihre Anfrage sonst möglicherweise bereits gesendet und der zugrunde liegende Stream geschlossen wird.Eine undokumentierte Funktion des implementierten
formData
Feldsrequest
ist die Möglichkeit, Optionen an das verwendeteform-data
Modul zu übergeben:request({ url: 'http://example.com', method: 'POST', formData: { 'regularField': 'someValue', 'regularFile': someFileStream, 'customBufferFile': { value: fileBufferData, options: { filename: 'myfile.bin' } } } }, handleResponse);
Dies ist nützlich, wenn Sie einen Anruf vermeiden,
requestObj.form()
aber einen Puffer als Datei hochladen müssen. Dasform-data
Modul akzeptiert auchcontentType
(den MIME-Typ) undknownLength
Optionen.Diese Änderung wurde im Oktober 2014 hinzugefügt (also 2 Monate nachdem diese Frage gestellt wurde), daher sollte sie jetzt sicher verwendet werden können (ab 2017). Dies entspricht der Version
v2.46.0
oder höher vonrequest
.quelle
Die Antwort von Leonid Beschastny funktioniert, aber ich musste auch ArrayBuffer in Buffer konvertieren, der im
request
Modul des Knotens verwendet wird. Nach dem Hochladen der Datei auf den Server hatte ich sie im gleichen Format wie die HTML5 FileAPI (ich verwende Meteor). Vollständiger Code unten - vielleicht ist er für andere hilfreich.function toBuffer(ab) { var buffer = new Buffer(ab.byteLength); var view = new Uint8Array(ab); for (var i = 0; i < buffer.length; ++i) { buffer[i] = view[i]; } return buffer; } var req = request.post(url, function (err, resp, body) { if (err) { console.log('Error!'); } else { console.log('URL: ' + body); } }); var form = req.form(); form.append('file', toBuffer(file.data), { filename: file.name, contentType: file.type });
quelle
ArrayBuffer
zuBuffer
, mit build-in -Buffer
Konstruktor aus einem Array von Bytes :var buffer = new Buffer(new Uint8Array(ab));
Sie können auch die Unterstützung für "benutzerdefinierte Optionen" aus der Anforderungsbibliothek verwenden. Mit diesem Format können Sie einen mehrteiligen Formular-Upload erstellen, jedoch mit einem kombinierten Eintrag sowohl für die Datei als auch für zusätzliche Formularinformationen wie Dateiname oder Inhaltstyp. Ich habe festgestellt, dass einige Bibliotheken erwarten, dass Dateien in diesem Format hochgeladen werden, insbesondere Bibliotheken wie multer.
Dieser Ansatz ist offiziell im Formularbereich der Anforderungsdokumente unter https://github.com/request/request#forms dokumentiert
//toUpload is the name of the input file: <input type="file" name="toUpload"> let fileToUpload = req.file; let formData = { toUpload: { value: fs.createReadStream(path.join(__dirname, '..', '..','upload', fileToUpload.filename)), options: { filename: fileToUpload.originalname, contentType: fileToUpload.mimeType } } }; let options = { url: url, method: 'POST', formData: formData } request(options, function (err, resp, body) { if (err) cb(err); if (!err && resp.statusCode == 200) { cb(null, body); } });
quelle
const remoteReq = request({ method: 'POST', uri: 'http://host.com/api/upload', headers: { 'Authorization': 'Bearer ' + req.query.token, 'Content-Type': req.headers['content-type'] || 'multipart/form-data;' } }) req.pipe(remoteReq); remoteReq.pipe(res);
quelle