使用express+multer实现node中的图片上传

在前端中,我们使用ajax来异步上传图片,使用file-input来上传图片,使用formdata对象来处理图片数据,post到服务器中

在node中使用multer中间件来对上传路由接口进行处理
multer文档
package.json

html部分

<body>
<div class="form-group">
        <label>File input:</label>

        <input type="file" name="file" id="file">

        <p id="result"></p>

        <img id="img" src="">
    </div>

    <button id="upload" class="btn btn-default">提交</button>

    </body>

js部分

    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <script>
        //上传图片的业务逻辑函数
        function uploadFile(){
            //上传图片的input
            var file = document.getElementById("file")
            //因为准备用post提交,又因为图片的内容比较大,所以我们选择使用formdata来承载数据
            //创建formdata对象
            var formData = new FormData();
            //给formdata对象中放入数据(键值对的方式)
            formData.append('file',file.files[0]);
            //提交请求
            $.ajax({
                url: '/upload',//请求路径
                type: 'POST',
                data: formData,
                contentType: false,//为了让浏览器根据传入的formdata来判断contentType
                processData: false,//同上
                success: function(data){
                    if(200 === data.code) {
                        $('#result').html("上传成功!");
                        $('#img').attr('src',data.data);
                    } else {
                        $('#result').html("上传失败!");
                    }
                    console.log(2)
                },
                error: function(){
                    $("#result").html("与服务器通信发生错误");
                }
            });
            console.log(1)
        }
        //给按钮添加点击事件
        function postPage() {
                //上传按钮
                var uploada = document.getElementById('upload');
                uploada.addEventListener("click",function () {
                    uploadFile();
                },false);
        }
        window.onload = function () {
            postPage();
        }
</script>

NodeJS逻辑代码

const http = require('http')
const path = require('path')
const express = require('express')

//是nodejs中处理multipart/form-data数据格式(主要用在上传功能中)的中间件
//文档:https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md
const multer = require('multer')

const app = express()
//配置express的静态目录
app.use(express.static(path.join(__dirname, 'public')));


app.get('/',(req,res)=>{
    res.sendFile(__dirname+'/index.html')
})



//配置diskStorage来控制文件存储的位置以及文件名字等
var storage = multer.diskStorage({
    //确定图片存储的位置
    destination: function (req, file, cb){
        cb(null, './public/uploadImgs')
    },

![](http://images2017.cnblogs.com/blog/1283058/201802/1283058-20180201154342296-515041615.png)


    //确定图片存储时的名字,注意,如果使用原名,可能会造成再次上传同一张图片的时候的冲突
    filename: function (req, file, cb){
        cb(null, Date.now()+file.originalname)
    }
});
//生成的专门处理上传的一个工具,可以传入storage、limits等配置
var upload = multer({storage: storage});

//接收上传图片请求的接口
app.post('/upload', upload.single('file'), function (req, res, next) {
    //图片已经被放入到服务器里,且req也已经被upload中间件给处理好了(加上了file等信息)
    
    //线上的也就是服务器中的图片的绝对地址
    var url = '/uploadImgs/' + req.file.filename
    res.json({
        code : 200,
        data : url
    })
});


http.createServer(app).listen(3000,()=>{
    console.log('server is listening')
})

版权声明:本文为mxs-blog原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/mxs-blog/p/8399377.html