在nodejs中从一台服务器上传图片到另一台服务器
image upload from one server to other in nodejs
没有使用 multer 上传文件
我的代码:
文件从 html 读取并传递到外部 url
router.post('/fileUpload',function (req,res) {
request({
uri: http//example.com/upload, // url of other server
method: "POST",
form: {
"name":req.body.name,
"image":? //image from html - no idea how to pass the req.files here
}
}, function (error, response, body) {
------------
------------
}
});
其他服务器 url : /example.com/upload
这是使用 multer 上传图片的代码
app.post('/upload',function(req,res){
var storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, 'uploads');
},
filename: function (req, file, callback) {
callback(null, file.fieldname + '-' + Date.now());
}
});
var upload = multer({ storage : storage }).array('productImage');
upload(req,res,function(err) {
if(err) {
return res.json({'success':0,'result':{},'errorMessage':'Unknown Error'});
}
return res.json({'success':1,'result':{},'errorMessage':''});
});
});
简单的答案是从上传的文件创建一个读取流并将其通过管道传输到第二个服务器,如下所示:
fs.createReadStream(req.files[0].path).pipe(request.post('http//example.com/upload'))
但是,有很多方法可以实现这一点。最有效的方法是使用从初始上传到第二个服务器的二进制流。您希望避免将第一台服务器用作所有上传的存储空间。
以下是我的做法:
在客户端上传时使用jQuery文件上传
(或任何其他 library/approach 上传原始二进制流)
$('#fileupload').fileupload({
url: 'https://server1.com/upload'
})
使用 Formidable(或其他类似 multer 的库)处理上传服务器端
(这将允许您分段读取二进制流,并在每个部分出现时对其进行处理)
app.post('/上传',函数(req,res){
var form = new formidable.IncomingForm();
form.parse(req);
form.onPart = function(part) {
fs.createReadStream(part).pipe( request.post('http//example.com/upload'))
}
}
收到二进制上传的每个部分后,您可以通过 pipe() 将二进制文件直接流式传输到第二台服务器,以避免必须将其存储在第一台服务器上。
完成这项工作的关键是将文件上传和传输视为二进制位流。当用户上传文件 (req.body) 时,您希望从该文件创建一个读取流,并将二进制文件通过管道传输到 request.post()
.
从上传的文件创建 readStream 并将其通过管道传输到另一个 server.check 这个 link https://www.npmjs.com/package/request
,您将轻松完成此操作。
没有使用 multer 上传文件
我的代码:
文件从 html 读取并传递到外部 url
router.post('/fileUpload',function (req,res) {
request({
uri: http//example.com/upload, // url of other server
method: "POST",
form: {
"name":req.body.name,
"image":? //image from html - no idea how to pass the req.files here
}
}, function (error, response, body) {
------------
------------
}
});
其他服务器 url : /example.com/upload
这是使用 multer 上传图片的代码
app.post('/upload',function(req,res){
var storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, 'uploads');
},
filename: function (req, file, callback) {
callback(null, file.fieldname + '-' + Date.now());
}
});
var upload = multer({ storage : storage }).array('productImage');
upload(req,res,function(err) {
if(err) {
return res.json({'success':0,'result':{},'errorMessage':'Unknown Error'});
}
return res.json({'success':1,'result':{},'errorMessage':''});
});
});
简单的答案是从上传的文件创建一个读取流并将其通过管道传输到第二个服务器,如下所示:
fs.createReadStream(req.files[0].path).pipe(request.post('http//example.com/upload'))
但是,有很多方法可以实现这一点。最有效的方法是使用从初始上传到第二个服务器的二进制流。您希望避免将第一台服务器用作所有上传的存储空间。
以下是我的做法:
在客户端上传时使用jQuery文件上传 (或任何其他 library/approach 上传原始二进制流) $('#fileupload').fileupload({ url: 'https://server1.com/upload' })
使用 Formidable(或其他类似 multer 的库)处理上传服务器端 (这将允许您分段读取二进制流,并在每个部分出现时对其进行处理) app.post('/上传',函数(req,res){ var form = new formidable.IncomingForm();
form.parse(req);
form.onPart = function(part) {
fs.createReadStream(part).pipe( request.post('http//example.com/upload'))
}
}
收到二进制上传的每个部分后,您可以通过 pipe() 将二进制文件直接流式传输到第二台服务器,以避免必须将其存储在第一台服务器上。
完成这项工作的关键是将文件上传和传输视为二进制位流。当用户上传文件 (req.body) 时,您希望从该文件创建一个读取流,并将二进制文件通过管道传输到 request.post()
.
从上传的文件创建 readStream 并将其通过管道传输到另一个 server.check 这个 link https://www.npmjs.com/package/request
,您将轻松完成此操作。