• 技术文章 >web前端 >js教程

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

    2016-05-16 16:54:25原创643
    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--
    */

    最后这个注释的是标准格式“ \n”代表实际的字符串,为了看着舒服,视觉上也调整一下
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:jquery 绑定回车动作扑捉回车键触发的事件_jquery 下一篇:js 与 php 通过json数据进行通讯示例_javascript技巧
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• JavaScript的Symbol类型、隐藏属性及全局注册表详解• 18个常见angular面试题(附答案分析)• 什么是消息队列?node中如何使用消息队列?• 浅析IDEA中如何开发Angular• 整理总结JavaScript常见的BOM操作
    1/1

    PHP中文网