
下面是一个文件上传的 express demo, 文件以二进制方式上传
import fs from 'node:fs' import express from 'express' import stream from 'progress-stream' const port = 3000 const app = express() app.post('/upload', function (req, res) { const length = req.headers['content-length'] const str = stream({ length, time: 100, }) str.on('progress', (process) => { let percent = process.percentage | 0 // 这里可以打印进度 console.log(`percent`, percent) }) req.pipe(str).pipe(fs.createWriteStream(`test.mp4`)) req.on('end', async () => { res.status(200).end('ok') }) }) server.listen(port, () => { console.log('server start at ' + port) }) 此时,如果前端直接通过 3000 端口与 express 交互, 流媒体上传的进度可以被正常捕获。
[ 问题 ]:
如果想通过 nginx 服务器转发,应该如何配置呢?
目前简单如下配置,nginx 将在文件完整接收后一次性发送给 express ,也就是说 express 无法捕获上传进度
location / { client_max_body_size 100m; proxy_pass http://127.0.0.1:3000/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } 1 ysc3839 2023-12-30 06:27:28 +08:00 via Android 把 nginx proxy buffer 关掉?不过这么做的话如果处理速度过慢,上传速度也会受到限制。 |