Node.js模拟浏览器文件上传示例

高洛峰
풀어 주다: 2016-12-24 17:25:24
원래의
1317명이 탐색했습니다.

OSChina上发过了,那个也是我的,现在放到这来,哈哈

这段代码只能一次上传一个文件~~

var path=require("path"); var fs=require("fs"); var http=require("http"); //post值payload var getfield=function(field, value) { return 'Content-Disposition: form-data; name="'+field+'"\r\n\r\n'+value+'\r\n'; } //文件payload var getfieldHead=function (field, filename) { var fileFieldHead='Content-Disposition: form-data; name="'+field+'"; filename="'+filename+'"\r\n'+'Content-Type: '+getMime(filename)+'\r\n\r\n'; return fileFieldHead; } //获取Mime var getMime=function (filename) { var mimes = { '.png': 'image/png', '.gif': 'image/gif', '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.js': 'appliction/json', '.torrent': 'application/octet-stream' }; var ext = path.extname(filename); var mime = mimes[ext]; mime=!!mime?mime:'application/octet-stream'; return mime; } //获取边界检查随机串 var getBoundary=function() { var max = 9007199254740992; var dec = Math.random() * max; var hex = dec.toString(36); var boundary = hex; return boundary; } //获取boundary var getBoundaryBorder=function (boundary) { return '--'+boundary+'\r\n'; } //字段格式化 function fieldPayload(opts) { var payload=[]; for(var id in opts.field){ payload.push(getfield(id,opts.field[id])); } payload.push(""); return payload.join(getBoundaryBorder(opts.boundary)); } //post数据 function postRequest (opts) { filereadstream(opts,function (buffer) { var options=require('url').parse(opts.url); var Header={}; var h=getBoundaryBorder(opts.boundary); var e=fieldPayload(opts); var a=getfieldHead(opts.param,opts.file); var d="\r\n"+h; Header["Content-Length"]=Buffer.byteLength(h+e+a+d)+buffer.length; Header["Content-Type"]='multipart/form-data; boundary='+opts.boundary; options.headers=Header; options.method='POST'; var req=http.request(options,function(res){ var data=''; res.on('data', function (chunk) { data+=chunk; }); res.on('end', function () { console.log(res.statusCode) console.log(data); }); }); req.write(h+e+a);log.diy(h+e+a+buffer+d); req.write(buffer); req.end(d); }); } //读取文件 function filereadstream(opts, fn) { var readstream = fs.createReadStream(opts.file,{flags:'r',encoding:null}); var chunks=[]; var length = 0; readstream.on('data', function(chunk) { length += chunk.length; chunks.push(chunk); }); readstream.on('end', function() { var buffer = new Buffer(length); for(var i = 0, pos = 0, size = chunks.length; i < size; i++) { chunks[i].copy(buffer, pos); pos += chunks[i].length; } fn(buffer); }); } //各类设置 var opt={ "url":"http://xxxx.xx",//url "file":"00.jpg",//文件位置 "param":"file",//文件上传字段名 "field":{//其余post字段 "client":"1", "title":"ok" }, "boundary":"----WebKitFormBoundary"+getBoundary() } postRequest(opt); /* ------WebKitFormBoundaryuzKmkAovUuYsQ1Dt\r\n Content-Disposition: form-data; name="file"; filename="00.jpg"\r\n Content-Type: application/octet-stream \r\n \r\n +file\r\n ------WebKitFormBoundaryuzKmkAovUuYsQ1Dt\r\n Content-Disposition: form-data; name="fieldName" \r\n \r\n +value\r\n ------WebKitFormBoundaryuzKmkAovUuYsQ1Dt-- */
로그인 후 복사

最后这个注释的是标准格式“\r\n”代表实际的字符串,为了看着舒服,视觉上也调整一下


更多Node.js模拟浏览器文件上传示例相关文章请关注PHP中文网!


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!