使用 node上传文件操作

使用get 在  使用 express 加强过的 res的query的功能就能获取到;

而post 则得不到 需要借助工具; 

而post一般也分两种;  

 普通 表单数据的上传(a=11&b=11)和 文件上传 (二进制);

现在先说 处理处理普通表单处理;  使用 express的中间件 body-parser;

后台js 部分

const express=require('express');
const fs = require('fs');
const path= require('path');

const server = express();
//post 拿到body的表单数据;
const bodyParser = require('body-parser');
//post 拿到文件的二进制数据;


// 使用bodyparser中间件;
server.use(bodyParser.urlencoded({extended:false}));

server.use('/',function (req,res) {
    //res.body只能接受普通表单数据; 不能接受二进制文件数据


    //使用bodyparse 中间件 才能得到res.body对象;注意
   console.log(req.body);
   res.send('ok');
});


server.listen(8080)

前台部分

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/" method="post" >
    <div>内容:<input type="text" name="user" /></div>
    <div><input type="submit" value="提交" /></div>
</form>

</body>
</html>

这样我就可以得到在 请求中 post携带的参数字符串了;

来说post文件;

首先我们要 知道 form 里的一个属性  (enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码)。

三个option:

application/x-www-form-urlencoded :在发送前编码所有字符  =&=, 处理普通表单数据的;

multipart/form-data   :不对字符编码。在使用包含文件上传控件的表单时,必须使用该值;

 ext/plain : 空格转换为 "+" 加号,但不对特殊字符编码。 很少用 可以自己研究下。

很明显 这次我们选用multipart/form-data   

在服务端 处理 文件 使用 body-parser就不行了;需要 multer;

先cnpm i -S multer;安装一下;

代码

const express=require('express');
const fs = require('fs');
const path= require('path');


const server = express();
//post 拿到body的表单数据;
const bodyParser = require('body-parser');
//post 拿到文件的二进制数据;
const multer = require('multer');

//如果使用 需要调用生成对象;并且设置 上传存储的目录
const objMulter = multer({dest:'./www/upload'});

//使用 实例化对象的any方法;接受任何命名的文件;还有.single(fieldname);fieldname就是 input的name; 对应不上 报500;
server.use(objMulter.single('user'));

// 使用bodyparser中间件;
server.use(bodyParser.urlencoded({extended:false}));

server.use('/',function (req,res) {
    //res.body只能接受普通表单数据; 不能接受二进制文件数据
    console.log(req.file);

    //使用bodyparse 中间件 才能得到res.body对象;注意
  // console.log(req.body);
   res.send('ok');
});


server.listen(8080)

 会得到这个对象,但是dest的是一个乱码文件, 所以 这里需要改成对应的上传文件的extname扩展名;

{ fieldname: 'user',
  originalname: '21531488494_.pic_hd.jpg',
  encoding: '7bit',
  mimetype: 'image/jpeg',
  destination: './www/upload',
  filename: 'b30cd78a2dc06020af42920c9e2fce93',
  path: 'www/upload/b30cd78a2dc06020af42920c9e2fce93',
  size: 460460 }

这样写就完事了

const express=require('express');
const fs = require('fs');
const pathLib= require('path');


const server = express();
//post 拿到body的表单数据;
const bodyParser = require('body-parser');
//post 拿到文件的二进制数据;
const multer = require('multer');

//如果使用 需要调用生成对象;并且设置 上传存储的目录
const objMulter = multer({dest:'./www/upload'});

//使用 实例化对象的any方法;接受任何命名的文件;还有.single(fieldname);fieldname就是 input的name; 对应不上 报500;
server.use(objMulter.any());

// 使用bodyparser中间件;
server.use(bodyParser.urlencoded({extended:false}));

server.use('/',function (req,res) {
    //res.body只能接受普通表单数据; 不能接受二进制文件数据
    // 使用 multer 以后就可以使用 res.files

   // console.log(req.files[0]);

    //新的文件名字是  原来文件的乱码名字 + 原文件的扩展名
   const newFileName = req.files[0].path + pathLib.extname(req.files[0].originalname);

    // 使用fs的模块功能,把文件的名字替换
    fs.rename(req.files[0].path,newFileName,function (err,data) {
       if(err){
           console.log(err);
       }else{
           console.log(data);
       }

    })

    //使用bodyparse 中间件 才能得到res.body对象;注意
  // console.log(req.body);
   res.send('ok');
});


server.listen(8080)

猜你喜欢

转载自blog.csdn.net/wangrong111222/article/details/81977211
今日推荐