Nginx + Express + PM2 搭建简单的文件上传服务

基本思路

基本思路都是大同小异,本次开发是在原有的LNMP(Nginx + PHP + MySQL + Linux)加入Express的服务代理

  1. 基于Express实现一个简单的上传服务,使用express-fileupload中间件来实现文件上传
  2. PM2管理应用程序进程
  3. 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);
    }
});
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值