node 上傳文件 http client to post file

 

node作http client 發送post數據是很容易的事情,但要上傳文件就不是太容易了
主要是由於上傳文件的報文和普通post是不太同樣的html

要了解http post能夠看下這個 https://imququ.com/post/four-ways-to-post-data-in-http.htmlnode

npm上封裝好的第三方庫不少 好比request,咱們來看下本身實現須要怎麼作npm

 

首先要聲稱個隨機串,這個是用來作分段的標記
var boundaryKey = Math.random().toString(16)dom

上傳文件時要設置請求頭 Content-Type : 'multipart/form-data; boundary='+boundaryKey+''post

報文格式是這樣的:ui

假如 boundaryKey=AaB03xspa

Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="submit-name"

Larry
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--AaB03x--

 


from https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2code

每一個字段用 「--」+分割符號 分段orm

結尾用 「--」+分割符號+「--」 注意用\r\n換行 不可缺乏htm

 

代碼實現

 1 var http = require('http')
 2 var fs = require('fs')
 3 var querystring = require('querystring')
 4 var path = require('path')
 5 var util = require('util')
 6 
 7 var boundaryKey = Math.random().toString(16); // random string
 8 var reqdata = {
 9   'abc' : '123'
10 }
11 
12 var request = http.request({
13   host : 'abc.com',
14   port : 80,
15   path : '/abc',
16   method : 'POST'
17 }, function (response) {
18   var data = '';
19   response.on('data', function(chunk) {
20     data += chunk.toString();
21   });
22   response.on('end', function() {
23     console.log(data);
24   });
25 });
26 
27 var enddata = '\r\n--' + boundaryKey + '--';
28 function mkfield (field, value) {
29   return util.format('Content-Disposition: form-data; name="%s"\r\n\r\n%s', field, value);
30 }
31 var payload = '--' + boundaryKey + '\r\n'
32 for (var name in reqdata){
33   payload += mkfield(name ,reqdata[name]) + util.format('\r\n--%s\r\n', boundaryKey)
34 }
35 payload += 'Content-Disposition:form-data; name="img"; filename="image.jpg"\r\n'
36   + 'Content-Type:image/jpeg\r\n'
37   + 'Content-Transfer-Encoding: binary\r\n'
38   + '\r\n';
39 
40 request.setHeader('Content-Type', 'multipart/form-data; boundary='+boundaryKey+'');
41 //request.setHeader('Content-Length', Buffer.byteLength(payload)+Buffer.byteLength(enddata))
42 
43 request.write(payload )
44 
45 fs.createReadStream('文件路徑', { bufferSize: 4 * 1024 })
46 .on('end', function() {
47 //報文結束
48   request.end(enddata);
49 }).pipe(request, { end: false })
相關文章
相關標籤/搜索