使用Axios、Multer、Cloudinary上传文件遇EROFS只读文件系统错误
解决Cyclic平台部署MERN应用后图片上传只读文件系统错误
错误原因
Cyclic属于无服务器平台,其运行环境的文件系统是只读的。你的Multer配置使用diskStorage尝试将文件写入本地磁盘路径/var/task/src/public/images,这在平台环境下不被允许,因此抛出EROFS: read-only file system错误。
解决方案
既然最终要将图片上传到Cloudinary,完全不需要把文件写入本地磁盘。改用Multer的memoryStorage将文件暂存到内存,再直接从内存上传到Cloudinary即可。
步骤1:修改Multer配置为内存存储
const multer = require("multer"); // 用内存存储替代磁盘存储,避免写入本地文件系统 const storage = multer.memoryStorage(); const multerFilter = (req, file, cb) => { if (file.mimetype.startsWith("image")) { cb(null, true); } else { cb(new Error("Unsupported file format"), false); } }; exports.uploadPhoto = multer({ storage: storage, fileFilter: multerFilter, limits: { fileSize: 2000000 }, });
步骤2:修改上传逻辑,直接从内存上传到Cloudinary
const cloudinary = require("cloudinary").v2; const { uploadPhoto } = require("./path/to/your-multer-config"); // 配置你的Cloudinary账号信息 cloudinary.config({ cloud_name: "你的CloudName", api_key: "你的APIKey", api_secret: "你的APISecret", }); // 处理分类创建的路由 router.post("/create-category", uploadPhoto.single("image"), async (req, res) => { try { // 从请求中获取内存里的文件buffer const fileBuffer = req.file.buffer; // 通过Cloudinary的upload_stream直接上传内存中的文件 await new Promise((resolve, reject) => { cloudinary.uploader.upload_stream( { folder: "category-images", // 可选:Cloudinary中的存储文件夹 format: "jpeg" }, (error, result) => { if (error) return reject(error); // 这里执行分类创建逻辑,比如将分类信息和图片URL存入数据库 // 示例: // const newCategory = await Category.create({ // name: req.body.name, // imageUrl: result.secure_url // }); res.status(200).json({ success: true, message: "分类创建成功", // category: newCategory }); resolve(); } ).end(fileBuffer); }); } catch (error) { res.status(500).json({ success: false, message: error.message }); } });
内容的提问来源于stack exchange,提问作者Abu Sayem
相关产品推荐
相关产品推荐

