node.js-流式上传到云存储(巴士司机,请求)

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

我是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({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
    一起使用)<代码>请求
在内部使用此选项
  • 广告Streams2+支持,但以我的经验,Streams2+支持对我来说不是问题。没有内置的
    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
    来实现。如果