美文网首页
nodejs基础2-node.js处理POST文件数据

nodejs基础2-node.js处理POST文件数据

作者: 栗子daisy | 来源:发表于2019-04-21 19:18 被阅读0次

package.json:写脚本,声明依赖

包管理器:
  • npm/cnpm
  • yarn:

npm i yarn -g
yarn add xxx

node包前后端都可以用,比如前后端双向处理数据

前端包管理:
  • bower:

npm i bower -g
bower i xxx

eg. brwer i jquery


包:
  • 第三方包
  • 系统包:常用
    1.assert-断言(提升系统质量,参数校验等,成立无反应,不成立报错)
    assert(条件,msg)
    assert.deepEqual(变量,预期值,msg)
    assert.deepStrictEqual(变量,预期值,msg)
    2.path-路径(解析路径)
const path=require('path');
let str='/root/a/b/1.txt';
console.log(path.dirname(str));///root/a/b
console.log(path.extname(str));//.txt
console.log(path.basename(str));//1.txt
console.log(path.resolve('/root/a/b', '../c', 'build', '..', 'strict'));///root/a/c/strict
console.log(path.resolve(__dirname, 'build'));///c:/ww/5/build

__dirname: 魔术变量,不需要声明,不同文件表示不同,编译器给出的
3.url-网址(拆解和组装网址)前台组装,后台拆解

const url=require('url');
let str='http://www.bing.com:8080/a/b/1.html?a=1&a=2&a=3';
console.log(url.parse(str, true));

$ node url.js

Url {
  protocol: 'http:',
  slashes: true,
  auth: null,
  host: 'www.bing.com:8080',
  port: '8080',
  hostname: 'www.bing.com',
  hash: null,
  search: '?a=1&a=2&a=3',
  query: [Object: null prototype] { a: [ '1', '2', '3' ] },
  pathname: '/a/b/1.html',
  path: '/a/b/1.html?a=1&a=2&a=3',
  href: 'http://www.bing.com:8080/a/b/1.html?a=1&a=2&a=3' }

4.querystring-请求数据
5.net


net——网络通信


OSI七层参考模型
物理层 > 数据链路层 > 网络层(IP) > 传输层(TCP) > 会话层 > 表现层 > 应用层(HTTP)

5层模型
物理层 > 数据链路层 > 网络层(IP) > 传输层(TCP) > 应用层(HTTP)


net------TCP的node实现

TCP:传输文件
UDP:适合视频直播,流畅,丢失帧


数据通信:
1.GET
2.POST
普通数据——querystring
文件数据——

// enctype="multipart/form-data"
<form action="http://localhost:8080/upload" method="post" enctype="multipart/form-data">
      用户:<input type="text" name="username"><br>
      密码:<input type="password" name="password"><br>
      <input type="file" name="f1">
      <input type="submit" value="提交">
    </form>
const http=require('http');
const util=require('buffer_util');
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);

    //1.按照分隔符切分
    let res=util.bufferSplit(buffer, boundary);

    res.pop();
    res.shift();

    //2.每一个处理一下
    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);

      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);
        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);
      }
      //console.log(data.toString());
    });
  });
}).listen(8080);

POST文件 r\n换行
<分隔符>\r\n字段信息\r\n\r\n内容\r\n<分隔符>\r\n字段头\r\n\r\n内容\r\n<分隔符>\r\n字段头\r\n\r\n内容\r\n<分隔符>--

  • 1.用<分隔符>切分

[
null,
"\r\n字段信息\r\n\r\n内容\r\n",
"\r\n字段信息\r\n\r\n内容\r\n",
"\r\n字段信息\r\n\r\n内容\r\n",
'--'
]

  • 2.第0个和最后1个,扔掉

[
"\r\n字段信息\r\n\r\n内容\r\n",
"\r\n字段信息\r\n\r\n内容\r\n",
"\r\n字段信息\r\n\r\n内容\r\n",
]

  • 3.每一项扔掉头尾\r\n,切开

"字段信息\r\n\r\n内容"
"字段信息", "内容"

//二级制下完成,不能转成字符串
//buffer没有split,有slice
let buffer=new Buffer('abc\r\nddasdfafd\r\ndfaerewtwert');
function bufferSplit(buffer, delimiter){
  let arr=[];
  let n=0;
  while((n=buffer.indexOf(delimiter))!=-1){
    arr.push(buffer.slice(0, n));
    buffer=buffer.slice(n+delimiter.length);
  }
  arr.push(buffer);
  return arr;
}

console.log(bufferSplit(buffer, '\r\n').map(b=>b.toString()));
multiparty包

cnpm i multyparty

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);

相关文章

网友评论

      本文标题:nodejs基础2-node.js处理POST文件数据

      本文链接:https://www.haomeiwen.com/subject/znilgqtx.html