基本思路
基本思路都是大同小异,本次开发是在原有的LNMP(Nginx + PHP + MySQL + Linux)加入Express的服务代理
- 基于Express实现一个简单的上传服务,使用
express-fileupload
中间件来实现文件上传 - PM2管理应用程序进程
- Nginx新增文件大小限制和Express的配置
搭建步骤
1. package.json 配置
{
"name": "uploadserver",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1",
"express-fileupload": "^1.2.1"
}
}
2. app.js 主程序
const express = require('express');
// 引入express-fileupload中间件
const fileUpload = require('express-fileupload');
const app = express();
const port = 8001;
const ret = {};
// 设置文件上传大小
app.use(fileUpload({
limits: { fileSize: 50 * 1024 * 1024 },
}));
app.get('/photo', (req, res) => {
// 测试用的
res.send('Hello World!')
})
// 配置静态文件访问的路由
app.use('/photo/medias', express.static('uploads'));
// 上传接口的实现
app.post('/photo/upload', function(req, res) {
// 接收前端传递过来的文件对象
// req.files 接收前端传递过来的所有文件对象
const uploaObj = req.files.file;
if(!uploaObj) {
ret.err = '非法文件';
return res.status(200).send(ret);
}
// 定义文件名称
const nameArr = uploaObj.name.split('.');
const fileName = (new Date()).getTime() + '.' + nameArr.pop()
// 上传文件到指定目录,./uploads/ 与app.js同级
uploaObj.mv('./uploads/' + fileName , (err) => {
if(err) {
ret.err = '文件上传失败';
return res.status(200).send(JSON.stringify(ret));
} else {
ret.msg = '文件上传成功';
ret.path = fileName;
}
res.header("Content-Type", "application/json; charset=utf-8");
res.status(200).json(ret);
});
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
3. pm2运行
如果没有安装PM2的,执行npm install -g pm2
进入到app.js所在的目录下,执行:
pm2 start app.js --name upload-server
查看应用是否运行成功,通过端口查询(上述应用使用的是8001
)
netstat -anp | grep 8001
有返回则表示运行成功
tcp6 0 0 :::8001 :::* LISTEN 6550/node /webapps/
4. Nginx配置
指定一个别名
upstream mysvr {
server 127.0.0.1:8001; # 需要被代理的服务器
}
配置接收请求数据的大小和代理转发请求
location /photo {
client_max_body_size 20M; # 指定文件请求大小
proxy_pass http://mysvr; # nginx代理的服务
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
测试配置是否成功
sudo nginx -t
重启Nginx服务器
sudo nginx -s reload
5. 小程序上传调用接口
wx.uploadFile({
filePath: file_path,
// 设置上传文件的名称
// 后端使用 req.files.file 接收
name: 'file',
url: 'https://myserv/photo/upload',
header: {
'content-type': 'application/json' // 默认值
},
success(res) {
const resData = JSON.parse(res.data);
resolve(resData);
},
fail(err) {
reject(err);
}
});