如何使用multer正确上传文件到文件系统?相关实现疑问咨询
问题解答
1. 发送文件的赋值方式是否正确?
完全不正确。input[type=file]的value属性只是浏览器伪装的本地文件路径字符串,仅包含文件名,不包含真实文件内容,也没法用于后端读取文件。
正确做法是使用FormData对象封装文件数据,同时调整AJAX配置:
- 需要从
input.files属性中取到真实的File对象 - AJAX需要设置
processData: false(不让jQuery自动序列化FormData)、contentType: false(让浏览器自动设置带boundary的multipart/form-data请求头)
修正后的前端AJAX部分代码:
$('#uploadBtn').click(function() { // 构造FormData对象 const formData = new FormData(); // 取文件对象,append到FormData,字段名要和后端multer配置对应 formData.append('myFile', chooseFile.files[0]); // 也可以加其他普通字段 formData.append('otherField', 'test value'); $.ajax({ url: 'http://localhost:3000/uploadImage', type: 'POST', crossDomain: true, cache: false, // 关键配置 processData: false, contentType: false, data: formData, success: function(data) { console.log(data) }, error: function(jqXHR, textStatus, err) { alert('text status ' + textStatus + ', err ' + err) } }) });
2. upload.single('myFile')中的"myFile"是什么?
你的猜测错误,它不是文件名,是前端上传文件时对应的表单字段名:
- 如果用FormData上传,就是你
append文件时用的第一个参数 - 如果用原生form表单提交,就是对应
input[type=file]的name属性值
multer会根据这个字段名去请求的form-data数据里找对应的文件内容,匹配不上的话会报错。
3. 如何指定上传文件的存储目录?
你已经用到了正确的配置方式,就是multer.diskStorage的destination配置项:
- 该配置的回调第二个参数就是你要存的目录路径,可以是相对路径(相对于项目启动目录)也可以是绝对路径
- 注意:你需要手动提前创建这个目录,multer不会自动生成不存在的目录,否则会抛出ENOENT错误
- 如果你没有配置
diskStorage,multer默认会把文件存在内存中,不会持久化到磁盘
另外你现有代码还有两处明显错误需要修正:
- 后端你定义的multer实例是
const uploadStorage = multer({ storage: storage }),但路由里写的是upload.single('myFile'),变量名不匹配,会直接报错,要改成uploadStorage.single('myFile') - 上传成功后可以通过
req.file拿到上传的文件信息,你现在只打印req.body是看不到文件内容的,比如可以加一行console.log(req.file)看文件的存储路径、原始名等信息。
内容的提问来源于stack exchange,提问作者seriously
相关产品推荐
相关产品推荐

