Node.js/Express后端:上传文件需临时存储再生成ReadStream吗?
无需存储文件,直接从Express上传文件创建ReadStream对接Adobe API
不需要先把上传文件存储到磁盘,利用Express的上传中间件或原生请求流就能直接生成ReadStream对接Adobe API,下面是两种可行方案:
方案一:用multer内存存储处理(推荐)
multer支持将上传文件暂存在内存中,无需写入磁盘,直接从内存buffer生成可读流:
- 先安装multer:
npm install multer
- 示例代码:
const express = require('express'); const multer = require('multer'); const { PDFServicesSdk, MimeType } = require('@adobe/pdfservices-node-sdk'); const { Readable } = require('stream'); const app = express(); // 配置multer为内存存储模式 const storage = multer.memoryStorage(); const upload = multer({ storage: storage }); app.post('/process-pdf', upload.single('pdfFile'), async (req, res) => { try { // 从内存buffer创建可读流 const readStream = Readable.from(req.file.buffer); // 初始化Adobe PDF Services客户端 const pdfServices = PDFServicesSdk.PDFServices.init({ credentials: PDFServicesSdk.Credentials.serviceAccountCredentialsBuilder() .fromFile('./pdfservices-api-credentials.json') .build() }); // 直接上传流到Adobe API const inputAsset = await pdfServices.upload({ readStream, mimeType: MimeType.PDF }); // 后续业务逻辑(比如调用Adobe的其他API处理文件) res.status(200).json({ assetId: inputAsset.assetId }); } catch (err) { res.status(500).json({ error: err.message }); } }); app.listen(3000, () => console.log('Server running on port 3000'));
方案二:原生Express请求流(无依赖)
Express的req对象本身就是可读流,如果上传请求仅包含文件数据(无其他表单字段),可以直接把req传入Adobe API:
const express = require('express'); const { PDFServicesSdk, MimeType } = require('@adobe/pdfservices-node-sdk'); const app = express(); app.post('/process-pdf', async (req, res) => { try { const pdfServices = PDFServicesSdk.PDFServices.init({ credentials: PDFServicesSdk.Credentials.serviceAccountCredentialsBuilder() .fromFile('./pdfservices-api-credentials.json') .build() }); // 直接使用req作为可读流上传 const inputAsset = await pdfServices.upload({ readStream: req, mimeType: MimeType.PDF }); res.status(200).json({ assetId: inputAsset.assetId }); } catch (err) { res.status(500).json({ error: err.message }); } }); app.listen(3000, () => console.log('Server running on port 3000'));
注意事项
- 方案二仅适用于纯文件上传的请求,如果请求包含表单字段,会把字段数据也传入Adobe API导致报错,因此更推荐方案一。
- 若上传超大文件,内存存储可能引发内存占用过高问题,此时可以用multer配置临时磁盘存储,处理完成后删除临时文件即可。
内容的提问来源于stack exchange,提问作者soumyadeep.eth
相关产品推荐
相关产品推荐

