node.js-流式上传到云存储(巴士司机,请求)
我是node.js的新手。我试图做的是通过node.js服务器将文件从web浏览器上传到云存储 我正在使用“express”、“request”和“busboy”模块node.js-流式上传到云存储(巴士司机,请求),node.js,upload,request,streaming,busboy,Node.js,Upload,Request,Streaming,Busboy,我是node.js的新手。我试图做的是通过node.js服务器将文件从web浏览器上传到云存储 我正在使用“express”、“request”和“busboy”模块 var express=require(“express”); var请求=要求(“请求”); var BusBoy=要求(“BusBoy”); var router=express.router(); 路由器.post(“/upload”),功能(请求、恢复、下一步){ var-busboy=new-busboy({heade
var express=require(“express”);
var请求=要求(“请求”);
var BusBoy=要求(“BusBoy”);
var router=express.router();
路由器.post(“/upload”),功能(请求、恢复、下一步){
var-busboy=new-busboy({headers:req.headers});
var json={};
on(“文件”,函数(字段名、文件、文件名、编码、mimetype){
文件.on(“数据”,函数(数据){
log(`streamed${data.length}`);
});
on(“end”,function()){
log(`finished streaming${filename}`);
});
var r=请求({
url:“http://”,
方法:“张贴”,
标题:{
“自定义标题”:“您好”,
},
表格数据:{
“上载”:文件
}
},函数(错误,httpResponse,body){
控制台日志(“上传”);
json.response=body;
});
});
营业员开(“字段”,功能(名称,val){
log(`name:${name},value:${value}`);
});
关于(“完成”,函数(){
res.send(json);
});
所需管道(公共汽车司机);
});
module.exports=路由器代码>我意识到这个问题已经有7个月了,但我将在这里回答它,试图帮助其他人解决这个问题
实际上,您有两个选择:添加文件大小,或者使用请求以外的其他方法
注意:我在第一次发布后不久编辑了这篇文章,希望能提供更多的上下文
用别的东西
如果您不需要它拥有的所有烘焙功能,可以使用一些替代方案来代替请求
- 可以在简单的情况下单独使用,也可以与(例如,
got
一起使用)<代码>请求
在内部使用此选项
https
支持,您必须指定请求
那样对表单数据进行任何特殊处理,但通常与表单数据
或表单数据2
一起使用。虽然我很难通过公司代理让它工作,但这可能是因为我是一个网络新手传输编码:chunked
,因此要使用它上载文件,您需要将文件大小与文件一起添加,如果从web客户端上载,则意味着客户端需要将文件大小与文件本身一起发送到服务器
我想到的方法是在文件字段之前发送自己字段中的文件元数据
我用描述我所做的事情的注释修改了你的例子。请注意,我没有包括对收到的数据的任何验证,但我建议您添加这一点
var express=require(“express”);
var请求=要求(“请求”);
var BusBoy=要求(“BusBoy”);
var router=express.router();
路由器.post(“/upload”),功能(请求、恢复、下一步){
var-busboy=new-busboy({headers:req.headers});
var json={};
//使用此选项可以缓存作为文件元数据的任何字段。
var fileMetas={};
on(“文件”,函数(字段名、文件、文件名、编码、mimetype){
//请确保将此道具名称与用于检测元字段的模式匹配。
var meta=fileMetas[fieldname+'.meta'];
如果(!meta){
//确保转储该文件。
resume();
//然后,在这里执行某种错误处理,因为您无法上载文件
//不知道它的长度。
返回;
}
文件.on(“数据”,函数(数据){
log(`streamed${data.length}`);
});
on(“end”,function()){
log(`finished streaming${filename}`);
});
var r=请求({
url:“http://”,
方法:“张贴”,
标题:{
“自定义标题”:“您好”,
},
表格数据:{
//formData字段的值+选项形式。
“上传”:{
值:文件,
选项:{
文件名:meta.name,
知识长度:meta.size
}
}
}
},函数(错误,httpResponse,body){
控制台日志(“上传”);
json.response=body;
});
});
营业员开(“字段”,功能(名称,val){
//使用您想要的任何模式。我使用了(fileFieldName+“.meta”)。
//另一个好的方法可能是(“meta:”+fileFieldName)。
if(/\.meta$/.test(名称)){
//我发送一个带有{name,size,type,lastModified}的对象,
//这些只是从文件对象中提取的公共道具。
//注意:如果val不可解析,可能应该添加错误处理。
fileMetas[name]=JSON.parse(val);
log(`file metadata:name:${name},value:${value}`);
返回;
}
//否则,处理字段为正常。
log(`name:${name},value:${value}`);
});
关于(“完成”,函数(){
res.send(json);
});
所需管道(公共汽车司机);
});
module.exports=路由器;
在客户机上,您需要在文件本身之前发送所谓的字段上的元数据。这可以通过在文件之前排序
控件并更新其值onchange
来实现。如果