Leiten Sie eine hochgeladene Datei von einem remote server mit dem node (am besten mit gleichen Dateinamen)
Ich möchte eine Datei hochladen, in meinem app.js server , die sollten die Leitung, die Datei auf eine crossdomain-server wie meine upload.js server.
Den vollständigen code finden Sie unter dem folgenden link
Den upload.js server arbeitet. Mein problem ist das app.js server. Anfrage scheint in der Lage sein, streaming-Dateien (https://github.com/request/request#streaming). Aber ich bekomme es nicht funktioniert.
Ich bin auch immer : [Fehler: Ungültiges Protokoll] in meinem app.js.
Es musst diese Zeile:
fs.createReadStream(file.path).pipe(request.post('localhost:4000/upload'))
Änderte ich die post zu setzen und in meiner upload.js die post-Methode auch, aber es ergibt den gleichen Fehler.
Mein Ziel ist es, eine Datei hochladen, von der html-Seite auf localhost:3000/upload die Rohre die Datei auf localhost:4000/hochladen (am besten mit gleichen Dateinamen) . Aber ich bekomme es nicht funktioniert (diese post nicht hat mir geholfen).
app.js:
var express = require('express')
, multiparty = require('multiparty')
, request = require('request')
, fs = require('fs')
, util = require('util')
, http = require('http');
var app = express();
app.use('/static', express.static('static'));
process.on('uncaughtException', function (err) {
console.log(err);
});
app.get('/', function (req, res) {
res.redirect('static/index.html');
});
app.post('/upload', function(req, res, next){
//https://github.com/request/request#streaming
var form = new multiparty.Form();
form.parse(req, function(err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end(util.inspect({fields: fields, files: files}));
});
form.on('file', function(name,file) {
//stream it to localhost:4000 with same name
fs.createReadStream(file.path).pipe(request.post('localhost:4000/upload'))
console.log(file.path);
});
});
var server = app.listen(3000, '0.0.0.0' ,function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
index.html:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>Upload</title>
</head>
<body>
<h2>Upload</h2>
<form method="post" action="/upload" enctype="multipart/form-data">
<input type="file" id="file" name="file" />
<button>upload</button>
</form>
</body>
</html>
upload.js:
var express = require('express')
, multiparty = require('multiparty')
, cors = require('cors')
, util = require('util')
, app = express();
app.use(cors());
process.on('uncaughtException', function (err) {
console.log(err);
});
app.get('/', cors(), function(req, res, next){
res.json({msg: 'This is CORS-enabled for all origins!'});
});
app.post('/upload', cors(), function(req, res, next){
var form = new multiparty.Form();
form.parse(req, function(err, fields, files) {
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end(util.inspect({fields: fields, files: files}));
});
form.on('file', function(name,file) {
console.log(file);
console.log(name);
});
});
app.listen(4000, function(){
console.log('CORS-enabled web server listening on port 4000');
});
InformationsquelleAutor svenhornberg | 2015-08-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aktualisiert
Ich glaube, du ' re fehlt das Protokoll aus der url.
Es sollte funktionieren, wenn Sie fügen Sie die
http
Protokoll der url:Gestalten Sie die Upload-Arbeit
Wann leiten Sie den Inhalt der Datei in die POST-Funktion in upload.js die multipart-Formulardaten verloren. Sie benötigen zum erstellen eines neuen POST-request und übergeben Sie den ursprünglichen Inhalt der Datei.
Folgendes tun
app.js
:Diese wird auch übergeben den ursprünglichen Dateinamen.
Weitere Informationen finden Sie unter: https://github.com/request/request#multipartform-data-multipart-form-uploads
Bitte, siehe meine Antwort oben aktualisiert
Ich aktualisierte den code in github.com/svenhornberg/pipeupload, aber immer noch kein Ausgang in upload.js. Testen Sie es mit chrome.google.com/webstore/detail/postman/... (postimg.org/image/wq7plmjyf)
Es funktioniert für mich. Wenn ich gehe, localhost:3000/static/index.html und eine Datei hochladen kann ich sehen, dass upload.js es empfangen hat: CORS-fähigen web-server lauscht auf port 4000 { fieldName: 'Datei', originalFilename: 'Screen-Shot 2015-08-12 bei 6.24.23 Uhr.png', path: '/var/folders/r7/w49fh_652tv89r9qqwf2hg_40000gn/T/b4Z4AEZSB95INiXy1cUH_u4n.png', headers: { 'content-disposition': 'form-data; name="Datei"; filename="Screen Shot 2015-08-12 bei 6.24.23 Uhr.png"', 'content-type': 'image/png' }, Größe: 464485 } Datei
okay, eine Idee, was ist der Unterschied zwischen verlangen.post und die Art und Weise der Postbote Verlängerung Beiträge zu localhost:4000/hochladen ? denn wenn ich es mit Postboten bekomme ich die Ausgabe wie erwartet : { fieldName: 'Datei', originalFilename: 'Hallo world.txt', path: '/tmp/g6Jd0O-pPXi2tPOcfeP7cPHd.txt', headers: { 'content-disposition': 'form-data; name="Datei"; filename="Hallo world.txt"', 'content-type': 'text/plain' }, size: 13 } Datei Linien, die sollte die Ausgabe von uploadjs:(von der diese Zeilen bilden.auf('file', function(name,Datei) { console.log ("Datei"); console.log(name); });)
InformationsquelleAutor kmandov
Ich hatte ein ähnliches problem, aber ich wollte den stream der Datei direkt auf dem remote-server, anstatt es zu speichern zuerst lokal. Hier meine Modifikationen, um streaming zu arbeiten:
requestJs
im code?es ist diese library: github.com/request/request
InformationsquelleAutor jameslk
Können Sie tatsächlich tun
stream.pipe(request.post(url));
, und dann auf die anderen server Ihrereq
variable einen stream-wie Verhalten, so dass Sie sollten in der Lage sein, umreq.pipe(fs.createWriteStream(path));
.Verwenden
req.params
auf Ihrer route zu erhalten, die mit dem Namen.Beispiel-code für den server ein (verwenden einige Hashalgorithmen wie md5 zur überprüfung deiner Anfrage):
Beispiel-code für server zwei:
InformationsquelleAutor HydraOrc