node通过http.request向其他服务器上传文件

很早就听说过node的大名了,只是一直没有去尝试。直到最近,为了简化代码上线流程,提高上线效率,决定使用node来开发服务器端的上线程序。

服务器主要完成在svn服务器上创建tag,代码的合并、压缩与打包,压缩包提交至CMS服务器,经由CMS服务器发布至全网cdn等一系列的流程。

开始的一系列开发工作都比较顺利,但是,当做到将压缩包上传至CMS服务器时,遇到了困难。我不知道该如何通过node发起一条带有文件的post请求。。。

通过查阅node的api手册,发现node是支持在服务器端发起http请求的。那么,剩下的麻烦的问题,就是,该如何构造该请求。

之前虽然也写过一段时间的后端代码,但是都是通过封装好的接口来实现的,但对于node来说,没有现成的实现。无奈,只好向google求助。

很快搜到了一篇帖子,介绍相关内容的,并且还附赠了代码!不过可惜的是,所附的代码还是存在问题,估计作者并没有亲测过。但这篇帖子却着实的让我受 到了很大的启发,至少让我清楚了两件事情:1、上传文件的http请求的body部分的格式;2、文件转化为http数据流的方式!

基于以上两点,我慢慢摸索出了上传文件的方法,在这里跟大家分享以下!

先简单的描述下http协议分包传输时的数据格式。

Content-type

Content-type需要指定为

multipart/form-data; boundary=' + boundaryKey

其中boundaryKey为一随机字符串,用于标识请求数据段。

请求体格式

每一段请求体均以”–” + boundaryKey开头,然后使用’rn’来做行分隔。

接下来是每一段请求体的描述信息,包括Content-Type以及Content-Disposition等字段信息。每一个字段信息结尾都以’rn’来标识行结束。

描述信息与请求体正文需要以一个空行隔开,即需要再输出一个’rn’。

最后是请求提正文。

直到最后一个请求体结束之后,再输出’rn–’ + boundaryKey + ‘–’作为整个请求的结束。

这样即完成了一次post请求所需的基本内容了。

接下来,在介绍下,将文件转换为http数据流所需要做的工作。

转换的基本过程:

  1. 调用http.request方法,返回一个http.ClientRequest类的实例http.ClientRequest的实例本质上来说是一个writable stream。
  2. 对要上传的文件创建一个读取文件流。
  3. 将从文件读取到的流数据写到http请求数据流中。
  4. 关闭http请求。

所需要用到的接口:

  1. http.request
  2. createReadStream
  3. stream.pipe
  4. stream.on(‘end’)事件

综合以上内容,给出简单实现的代码,供大家参考,欢迎大家交流!

function upload(){
    var boundaryKey = '----' + new Date().getTime();
    var options = {
        host:'www.test.com',//远端服务器域名
        port:80,//远端服务器端口号
        method:'POST',
        path:'/upload',//上传服务路径
        headers:{
            'Content-Type':'multipart/form-data; boundary=' + boundaryKey,
            'Connection':'keep-alive'
        }
    };
    var req = http.request(options,function(res){
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
            console.log('body: ' + chunk);
        });
        res.on('end',function(){
            console.log('res end.');
        });
    });
    req.write(
        '--' + boundaryKey + 'rn' +
        'Content-Disposition: form-data; name="upload"; filename="test.zip"rn' +
        'Content-Type: application/x-zip-compressedrnrn'
    );
    //设置1M的缓冲区
    var fileStream = fs.createReadStream('/data/test.zip',{bufferSize:1024 * 1024});
    fileStream.pipe(req,{end:false});
    fileStream.on('end',function(){
        req.end('rn--' + boundaryKey + '--');
    });
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js中,可以使用http.request方法来发送HTTP请求。为了上传文件,我们可以使用multipart/form-data格式来构建请求体。下面是一个上传文件的示例代码: ```javascript const fs = require('fs'); const http = require('http'); const options = { host: 'example.com', path: '/upload', method: 'POST', headers: { 'Content-Type': 'multipart/form-data' } }; const req = http.request(options, (res) => { console.log(`statusCode: ${res.statusCode}`); res.on('data', (d) => { process.stdout.write(d); }); }); const filePath = '/path/to/file.jpg'; const fileStream = fs.createReadStream(filePath); req.write('--boundary\r\n'); req.write(`Content-Disposition: form-data; name="file"; filename="${filePath}"\r\n`); req.write('Content-Type: image/jpeg\r\n'); req.write('\r\n'); fileStream.pipe(req, { end: false }); req.write('\r\n--boundary--\r\n'); req.end(); ``` 在上面的代码中,我们定义了一个options对象,包含了上传文件的URL、请求方法和请求头信息。然后,我们创建了一个http.request实例,并通过createReadStream方法创建了一个读取文件的流。接下来,我们构建了multipart/form-data格式的请求体,将文件流写入请求体,并将请求体发送到服务器。 需要注意的是,上传文件需要使用multipart/form-data格式,并且在请求头中设置Content-Type为multipart/form-data。此外,在请求体中需要指定boundary分隔符,用于分割不同的表单字段。在上面的示例中,我们使用了--boundary作为分隔符。 希望这个示例对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值