美文网首页
NodeJS--上传图片

NodeJS--上传图片

作者: BingJS | 来源:发表于2022-06-22 15:49 被阅读0次

使用multer实现图片上传

下载

npm i multer -S

引入

const multer = require("multer")
const path = require("path")

配置

//存储位置配置
var storage = multer.diskStorage({
    // 配置文件上传后存储的路径
    destination: function (req, file, cb) {
        // NodeJS的两个全局变量
        // console.log(__dirname);  //获取当前文件在服务器上的完整目录 
        // console.log(__filename); //获取当前文件在服务器上的完整路径 
        cb(null, path.join(__dirname,'public/upload'))
    },
    // 配置文件上传后存储的路径和文件名
    filename: function (req, file, cb) {
        cb(null, Date.now() + path.extname(file.originalname))
    }
})
var upload = multer({ 
  //文件大小数量限制
  limits:{
    //限制文件大小100kb
    fileSize: 100*1000,
    //限制文件数量
    files: 5
  },
  //存储位置配置
  storage: storage,
  //文件格式过滤
  fileFilter: function(req, file, cb){
        // 限制文件上传类型,仅可上传png格式图片
        if(file.mimetype == 'image/png' || file.mimetype == 'image/jpeg' || file.mimetype == 'image/gif'){
            cb(null, true)
        } else {
            cb(null, false)
        }
    }
})

在路由中使用

//upload.single('image'),接收单个文件数据,不能用于处理多文件上传
//('image') 中用于填写接收文件的 name 属性值,不一致则不接收
router.post("/product",upload.single("image"),(req,res)=>{
    //接收普通文本参数
    let {productName,price} = req.body;
    //接收上传文件数据
    let imgUrl = req.file.filename;
    let sql = "insert into product (productName,price,imgUrl) values (?,?,?)"
    conn.query(sql,[productName, price , imgUrl],(err,result)=>{
        if (err){
            console.log('增加失败');
            return;
        }
        let data;
        if (result.affectedRows === 1){
            data = {
                code: 0,
                msg: '添加成功'
            }
        }else{
            data = {
                code: 1,
                msg: '添加失败'
            }
        }
        res.send(data)
    })
})


let singleUpload = upload.single('singleFile');
//单个文件上传
router.post('/single',(req,res)=>{
    singleUpload(req,res,(err)=>{
        if(!!err){
            console.log(err.message)
            res.json({
                code: '2000',
                type:'single',
                originalname: '',
                msg: err.message
            })
            return;
        }
        if(!!req.file){
            res.json({
                code: '0000',
                type:'single',
                originalname: req.file.originalname,
                msg: ''
            })
        } else {
            res.json({
                code: '1000',
                type:'single',
                originalname: '',
                msg: ''
            })
        }
    });
});

let multerUpload = upload.array('multerFile');
//多个文件上传
router.post('/multer', (req,res)=>{
    multerUpload(req,res,(err)=>{
        if(!!err){
            res.json({
                code: '2000',
                type:'multer',
                fileList:[],
                msg: err.message
            });
        }
        let fileList = [];
        req.files.map((elem)=>{
            fileList.push({
                originalname: elem.originalname
            })
        });
        res.json({
            code: '0000',
            type:'multer',
            fileList:fileList,
            msg:''
        });
    });
});

前端

html

<div class="add">
        <p>商品名称: <input type="text" class="productName"></p>
        <p>商品价格: <input type="number" class="price" ></p>
        <!-- multiple: 允许同时上传多张图片 -->
        <!-- <p>商品图片: <input type="file" class="file" multiple="multiple"></p> -->
        <p>商品图片: <input type="file" class="file"></p>
        <p><button class="add-btn">添加商品</button></p>
</div>
<script src="js/axios.js"></script>
<script src="js/util.js"></script>
<script src="js/upload.js"></script>

js

// 新建表单数据对象,用来存储上传的文件及上传的其它数据
let param = new FormData()
 
$(".file").onchange = function(){
    //获取图片信息
    let file = this.files[0]
    //"image"为前后端约定vb的属性名
    param.append("image",file)
}
$(".add-btn").onclick = function(){
    let productName = $(".productName").value;
    let price = $(".price").value;
    param.append("productName",productName)
    param.append("price",price)
 
    axios.post("/product",param,{
        headers: {
            // 默认提交的类型
            // "content-type": "application/json"
            // 复杂的表单数据(只要上传文件,就必须是下面的类型)
            "content-type": "multipart/form-data"
        }
    })
    .then((res)=>{
        console.log(res.data);
    })
}

相关文章

网友评论

      本文标题:NodeJS--上传图片

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