You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js/Express后端:上传文件需临时存储再生成ReadStream吗?

无需存储文件,直接从Express上传文件创建ReadStream对接Adobe API

不需要先把上传文件存储到磁盘,利用Express的上传中间件或原生请求流就能直接生成ReadStream对接Adobe API,下面是两种可行方案:

方案一:用multer内存存储处理(推荐)

multer支持将上传文件暂存在内存中,无需写入磁盘,直接从内存buffer生成可读流:

  1. 先安装multer:
npm install multer
  1. 示例代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:49:58