文件上传

ajax 上传文件与 node multer 接收

前端

首先需要input标签选择文件, 然后需要一个按钮点击上传

<input type="file" name="uploadfile" id="uploadfile">
<button id="send">上传</button>

在js中获取inputbutton标签

var file = document.getElementById('uploadfile');
var send = document.getElementById('send');

当点击上传按钮是发送ajax请求, 上传文件

只能使用post请求
send.onclick = function () {
    var xhr = new XMLHttpRequest();
    xhr.onload = function() {
        if(xhr.status === 200){
            if(xhr.responseText === 'success'){
                alert('上传成功');
            }else{
                alert('上传失败');
            }
        }
    }
    // 创建一个FormData对象多为请求体
    var data = new FormData();
    /**
     * 向data中添加文件
     * 因为这里input是单文件的, 所以使用file.files[0]获取
     */
    data.append('uploadfile', file.files[0]);
    xhr.open('post', 'http://localhost:3000/uploadfile');
    xhr.send(data);
}

这里演示的是单文件上传, 如果希望多文件上传

可以在 input 标签条件属性 multiple="multiple"

然后在data.append

使用 0,1,2...file.files 分别获取多个文件, 或遍历file.files

然后添加到data中

后台如何接收前端传来的文件(nodeJs为例)

首先要创建一个nodeJs服务器,这里使用express创建

var express = require('express');
var app = express();

app.listen(3000, function(){
    console.log('服务器启动 端口:', 30000);
});

使用multer模块处理上传文件

var multer = require('multer');
var storage = multer.diskStorage({
    destnation: function(req, file, cd){
        // 设置文件存放路径, 这里存放在./file文件夹下
        cd(null, './file');
    },
    filename: function(req, file, cd) {
        // 设置文件的文件名
        var filename = file.originalname;// => 文件名(带后缀)
        var arr = filename.split('.');//按照 . 切割文件名
        var type = arr[arr.length-1];//获取后缀名
        // 把文件储存起来, 文件名加上时间戳防止重名
        cd(null, file.filename + '-' + Date.now() + '.' + type);
    }
});

var upload = multer({'storage': storage});

创建一个供前端提交的接口

/**
 * upload.single()中的参数要和前端data.append时的第一个参数一致
 * 使用 upload.single() 只支持单文件上传
 */
app.post('/uploadfile', upload.single('file'), function(req, res){
    res.send('success');
});

多文件上传时处理方法

使用upload.array()代替upload.single()

限定上传文件最大数量

// 限制最多只能传9个文件
app.post('/uploadfile', upload.array('file',9), function(req, res){
    res.send('success');
});

或者使用upload.any()直接不限制上传数量

app.post('/uploadfile', upload.any(), function(req, res){
    res.send('success');
});

使用expressmulter 插件需要本地先安装这两个插件

使用 npm i express multer安装两个插件

完整代码

前端

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>上传文件</title>
</head>

<body>
    <input type="file" name="file" id="file" multiple="multiple">
    <br>
    <button>上传</button>
    <script>
        var btn = document.querySelector('button');
        var file = document.querySelector('#file');
        btn.onclick = function(){
            var xhr = new XMLHttpRequest();
            xhr.onload = function(){
                if(xhr.status === 200){
                    console.log(xhr.responseText);
                }
            }
            var data = new FormData();
            for(var f of file.files){
                data.append('file', f);
            }
            xhr.open('post', 'uploadfile');
            xhr.send(data);
        }
    </script>
</body>

</html>

后端

const express = require('express');
const multer = require('multer');

let app = express();

app.use(express.static('public'));
app.listen(3000, () => console.log('服务器启动成功 端口: ', 3000));

let storage = multer.diskStorage({
    destination(req, file, cd){
        // 设置文件存储的目录
        cd(null, './file');
    },
    filename(req, file, cd){
        console.log(file.originalname);
        let arr = file.originalname.split('.');
        cd(null, file.filename + '-' + Date.now() + '.' + arr[arr.length-1]);//加入时间戳防止重名
    }
});

let upload = multer({storage});

/* app.post('/uploadfile', upload.single('file'), (req, res) => {
    res.send('success');
}); */
// 指定限定数量文件(最多上传多少个), upload.array('file', n)
app.post('/uploadfile', upload.array('file',3), (req, res) => {
    res.send('success');
});
// 多文件上传, 使用any()不限制数量
/* app.post('/uploadfile', upload.any(), (req, res) => {
    res.send('success');
}); */

若发现本文有任何错误, 欢迎指正, 谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值