我在前端使用react,在后端使用node js express js multer和mongodb,在开发服务器(本地主机)中它绝对没问题,即使使用postman测试也没有错误,但是当我使用生产服务器(部署在vercel) 给出此错误 “ENOENT:没有此类文件或目录,请在 axios put 方法响应中打开 'public/startupIcons/startupIcon-1673682105301-871934982.jpg'”。
我尝试更改目录,检查 vercel 生产源目录(该文件夹在那里可用),但没有任何效果。 其乘法器特定错误
multer 配置
const storage = multer.diskStorage({
destination: (req, file, cb) => {
if (file.fieldname === 'startupIcon') {
cb(null, '/public/images');
} else if (file.fieldname === 'companyId') {
cb(null, '/uploads/companyIds');
} else if (file.fieldname === 'documents') {
cb(null, '/uploads/companyIds');
}
},
filename: (req, file, cb) => {
cb(null, `${new Date().toISOString().replace(/:/g, '-')}-${file.originalname}`);
},
});
const filter = (req, file, cb) => {
const type = file.mimetype.split('/')[1];
if (file.fieldname === 'startupIcon') {
if (type === 'jpg' || type === 'jpeg' || type === 'png') {
cb(null, true);
} else {
cb(new Error('Not a jpg/jpeg File!!'), false);
}
}
if (file.fieldname === 'companyId' || file.fieldname === 'documents') {
if (type === 'pdf' || type === 'jpg' || type === 'jpeg' || type === 'png') {
cb(null, true);
} else {
cb(new Error('file should be in .pdf|.jpg|.jpeg|.png format!!'), false);
}
}
};
const upload = multer({
storage,
limits: {
fileSize: 1000000,
// fieldSize: 1016 * 1016,
},
fileFilter: filter,
});
module.exports = upload;
问题其实很简单。 Nextjs 不希望您在部署后更改文件或将文件添加到公用文件夹中。这也不是问题。如果您进行构建并在下次启动时使用,您可以在本地尝试。它也不会起作用。它是一个安全问题,接下来只允许访问构建时存在的公共文件。 Nextjs 希望您使用 CDN 来处理动态文件。我们所做的是使用另一个名为 files/assets 或 uploads 的文件夹。并更改我们的 nginx 或 apache 代理配置,以便 nginx 或 apache 传递该文件夹中的文件。如果我们没有可能性,我们可以创建一个 asset api 端点来从所述文件夹传送文件。
您可以使用“/tmp”文件夹临时保存无服务器功能中的文件,然后再将其上传到更永久的存储解决方案。部署后无法将文件写入其他位置。
有关更多信息,您可以查看无服务器函数中的 vercel 文件和临时存储文档。