node.js中的上传文件至服务器

//Buffer 的split方法
let buffer = new Buffer('abc\r\nddasdfafd\r\ndfaerewtwert');

function bufferSplit(buffer, delimiter){
  let res = [];
  let n = 0;
  while((n = buffer.indexOf(delimiter)) !== -1){
    res.push(buffer.slice(0, n));
    buffer = buffer.slice(n + delimiter.length);
  }
  res.push(buffer);
  return res;
}
console.log(bufferSplit(buffer, '\r\n').map(e => e.toString()));
//原生 node.js 实现post上传文件
const http = require('http');
const util = require('buffer_util.js');
const fs = require('fs');

http.createServer((req, res) => {
  let boundary='--'+req.headers['content-type'].split('; ')[1].split('=')[1];
  let arr = [];

  req.on('data', Buffer => {
    arr.push(Buffer);
  });
  req.on('end', () => {
    let buffer = Buffer.concat(arr);
    let res = util.bufferSplit(buffer, boundary);

    // console.log(res);
    res.pop();
    res.shift();

    res.forEach(buffer => {
      buffer = buffer.slice(2, buffer.length - 2);
      let n = buffer.indexOf('\r\n\r\n');
      let info=buffer.slice(0, n).toString();
      let data=buffer.slice(n+4);

      // console.log(info);
      /* 
      Content-Disposition: form-data; name="username"
      Content-Disposition: form-data; name="password"
      Content-Disposition: form-data; name="f1"; filename="prototype.png"
      Content-Type: image/png
      */
      if(info.indexOf('\r\n') !== -1){
        //文件
        let res2 = info.split('\r\n')[0].split(';');
        let name = res2[1].split('=')[1];
        let filename = res2[2].split('=')[1];

        name = name.substring(1, name.length-1);
        filename = filename.substring(1, filename.length-1);
        // console.log(name);  //"f1"
        fs.writeFile(`upload/${filename}`, data, err => {
          if(err){
            console.log(err);
          }else{
            console.log('上传成功');
          }
        })
      }else{
        //普通信息
        let name = info.split('; ')[1].split('=')[1];
        name = name.substring(1, name.length - 1);
        console.log(name)
      }
    })
  });
}).listen(8080);
//使用 multiparty 实现表单提交处理
const http = require('http');
const multiparty = require('multiparty');

http.createServer((req, res)=>{
  let form = new multiparty.Form({
    uploadDir: './upload'
  });

  form.parse(req);

  form.on('field', (name, value) => {
    console.log('字段:', name, value);
  });
  form.on('file', (name, file) => {
    console.log('文件:', name, file);
  });

  form.on('close', () => {
    console.log('表单解析完成');
  });
}).listen(8080);
// CORS 跨域共享
const http=require('http');

let allowOrigin={
  'http://localhost': true,
  'http://aaa.com': true,
  'https://aaa.com': true,
}

http.createServer((req, res)=>{
  let {origin}=req.headers;

  if(allowOrigin[origin]){
    res.setHeader('access-control-allow-origin', '*');
  }

  res.write('{"a": 12, "b": "Blue"}');
  res.end();
}).listen(8080);

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值