gpt4 book ai didi

node.js - 使用 Node 将上传的文件通过管道传输到远程服务器(理想情况下具有相同的文件名)

转载 作者:IT老高 更新时间:2023-10-28 23:20:19 34 4
gpt4 key购买 nike

我想在我的 app.js 服务器中上传一个文件,它应该将该文件通过管道传输到像我的 upload.js 服务器这样的跨域服务器。

完整的代码可以在下面的link下找到

upload.js 服务器正在工作。我的问题是 app.js 服务器。请求似乎能够流式传输文件( https://github.com/request/request#streaming )。但我不让它工作。我总是在我的 app.js 中得到:[错误:无效协议(protocol)]。

一定是这一行:

fs.createReadStream(file.path).pipe(request.post('localhost:4000/upload'))

我将 post 更改为 put 并且在我的 upload.js 中将 post 方法也更改为 put,但它会导致相同的错误。

我的目标是将 html 页面中的文件上传到 localhost:3000/upload,然后将文件通过管道传输到 localhost:4000/upload(最好使用相同的文件名)。 但我无法正常工作(这个 post 对我没有帮助)。

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>

上传.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');
});

最佳答案

更新

我相信您缺少网址中的协议(protocol)。如果您将 http 协议(protocol)添加到 url,它应该可以工作:

fs.createReadStream(file.path).pipe(request.post('http://localhost:4000/upload'))

使上传工作

当您将文件内容通过管道传输到 upload.js 中的 POST 函数时,多部分表单数据会丢失。您需要创建一个新的 POST 请求并传递原始文件内容。

app.js 中执行以下操作:

 form.on('file', function(name, file) {

var formData = {
file: {
value: fs.createReadStream(file.path),
options: {
filename: file.originalFilename
}
}
};

// Post the file to the upload server
request.post({url: 'http://localhost:4000/upload', formData: formData});
}

这也将传递原始文件名。如需更多信息,请参阅:https://github.com/request/request#multipartform-data-multipart-form-uploads

关于node.js - 使用 Node 将上传的文件通过管道传输到远程服务器(理想情况下具有相同的文件名),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32138748/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com