NodeJs+Express 利用multiparty中间件实现文件上传功能

服务端JS文件的写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
var fs = require('fs');
var path = require('path');
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
//登录
var Login_File = path.join(__dirname, 'demo/tongxunlu.json');
var router = express.Router();
var multiparty = require('multiparty');
var util = require('util');
// 图片上传
app.post('/demo/upload',function(req, res) {
// don't forget to delete all req.files when done
//生成multiparty对象,并配置上传目标路径
var form = new multiparty.Form({uploadDir: './upload/picture/'});

//上传完成后处理
form.parse(req, function(err, fields, files) {
var obj ={};

var filesTmp = JSON.stringify(files,null,2);
if(err){
console.log('parse error: ' + err);
}
else {

console.log('parse files: ' + filesTmp);
var inputFile = files.inputFile[0];
var uploadedPath = inputFile.path;
var dstPath = './upload/picture/' + inputFile.originalFilename;
//重命名为真实文件名
fs.rename(uploadedPath, dstPath, function(err) {
if(err){
console.log('rename error: ' + err);
res.writeHead(200, {'content-type': 'text/plain;charset=utf-8'});
res.end("{'status':200, 'message': '上传失败!'}");
} else {
console.log('rename ok');
res.writeHead(200, {'content-type': 'text/plain;charset=utf-8'});
res.end("{'status':400, 'message': '上传成功!'}");
}
});
}
});
});
module.exports = router;

这个服务端有三个坑需要注意

1.var form = new multiparty.Form({uploadDir: ‘./upload/picture/‘});
需要注意一下,这里的文件路径并不会自动创建,需要用户在开发过程中自己在项目的根目录中创建该路径,否则就会报文件路径不存在的错误。
2.var inputFile = files.inputFile[0];
这行代码中,inputFile是form表单中的input组件的name值,这里要在postman中将请求参数调整成inputFile,否则就会报变量未定义的错误。
看图:
logo
如果在Android中,以OKHttpUtils为例,应该这么写请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
OkHttpUtils.post()//
.addFile("inputFile", "messenger_01.png", uploadFile)//
.url(uploadUrl)
.build()//
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
Log.e("exception", e.getMessage());
}
@Override
public void onResponse(String response, int id) {
Log.e("response", response);
}
});

addFile中有三个参数,第一个就是要命名成与服务端一直的inputFile,第二个参数是上传到服务端后文件的存储名,第三个参数是文件的主体。

3.在这个服务端中,如果要返回请求结果,只能用res.end或者res.wirte,如果用res.json就会报错Can\’t set headers after they are sent的错误。

热评文章