【代码】Node.js模拟浏览器文件上传

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”代表实际的字符串,为了看着舒服,视觉上也调整一下

参考:

参考自(XiongLiding) 所分享代码

 http://www.cnodejs.org/topic/4ffed8544764b729026b1da3

欢迎转载

转载请注明出处,谢谢


快要结束学生时代了~







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值