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

如何在NextJS的/api路由中创建文件?

解决Vercel上Serverless函数无法创建目录的问题

我之前在Vercel部署Serverless函数时刚好踩过这个坑!Vercel的函数运行环境(基于AWS Lambda)除了特定的临时目录之外,整个文件系统都是只读的,所以你直接在项目目录下创建public文件夹肯定会触发EROFS报错。

核心解决方案:使用Vercel允许的可写临时目录

Vercel给Serverless函数开放了/tmp目录作为唯一可写的临时存储区域,空间上限是512MB。你只需要把创建目录的路径切换到这个目录下就行:

把原来的代码:

fs.mkdirSync(path.join(__dirname, "../../public"));

改成:

const tempPublicDir = path.join('/tmp', 'public');
fs.mkdirSync(tempPublicDir, { recursive: true });

这里加{ recursive: true }是为了确保如果父目录不存在的话也能自动创建,避免抛出"目录不存在"的额外错误。

完整的代码示例(/api/sendEmail.js)

const fs = require('fs');
const path = require('path');

export default async function handler(req, res) {
  try {
    // 创建临时public目录
    const tempPublicDir = path.join('/tmp', 'public');
    fs.mkdirSync(tempPublicDir, { recursive: true });

    // 示例:在临时目录创建一个测试文件(比如邮件附件)
    const tempFilePath = path.join(tempPublicDir, 'email-attachment.txt');
    fs.writeFileSync(tempFilePath, '这是邮件的临时附件内容');

    // 这里执行你的发送邮件逻辑,比如读取tempFilePath作为附件
    // ...

    // 可选:发送完成后清理临时文件(避免占用实例空间)
    fs.unlinkSync(tempFilePath);

    res.status(200).json({ message: '邮件发送成功' });
  } catch (err) {
    console.error('发送邮件失败:', err);
    res.status(500).json({ errorMessage: err.message });
  }
}

额外注意事项

  • 不要依赖/tmp目录的持久化:这个目录的内容在函数实例销毁后会被清除,同一实例的后续调用可能会保留内容,但绝对不能把它当作持久存储来用。
  • 如果需要持久化文件:比如需要长期保存生成的文件,建议使用云存储服务(比如Vercel Blob、AWS S3),而不是本地文件系统。
  • 空间限制:/tmp目录最多能使用512MB空间,如果处理大文件要注意不要超过这个上限。

内容的提问来源于stack exchange,提问作者Stevan Zečević

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:02:28