我正在尝试将图像文件上传到服务器根目录下的文件夹(/public/temp_upload)。服务器由Node.js编写,上传文件由multer完成。它在本地工作正常,但是当服务器移动到 docker 容器时,它会抛出权限错误。
这是代码片段。错误发生在 put 端点。
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, process.env.NODE_ENV === 'production' ? '/usr/src/app/public/temp_upload' : 'public/temp_upload');
},
filename: (req, file, cb) => {
cb(null, Date.now() + '-' + file.originalname);
},
});
const imageFilter = function(req, file, cb) {
// accept image only
if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
return cb(new Error('Only image files are allowed!'), false);
}
cb(null, true);
};
const upload = multer({storage: storage, fileFilter: imageFilter});
module.exports = app => {
app.post('/', async (req, res) => {
const key = nanoid();
console.log(req.body.type);
const fileType = req.body.type.replace('image/', '');
res.json({
key,
url:
process.env.NODE_ENV === 'production'
? `/usr/src/app/public/upload/${req.user.id}_${key}.${fileType}`
: `public/upload/${req.user.id}_${key}.${fileType}`,
}).end();
});
app.put('/', upload.single('image'), async (req, res) => {
res.status(200).json({tempPath: req.file.path});
});
};
错误是
image/jpeg
app_1 | [Error: EACCES: permission denied, open '/usr/src/app/public/temp_upload/1584467058084-3DkRrcPOfnF4pnEWRWyRu.jpg'] {
app_1 | errno: -13,
app_1 | code: 'EACCES',
app_1 | syscall: 'open',
app_1 | path: '/usr/src/app/public/temp_upload/1584467058084-3DkRrcPOfnF4pnEWRWyRu.jpg',
app_1 | storageErrors: []
app_1 | }``
最佳答案
我只是用卷来解决问题。为了更好地理解卷,请阅读文档的这一部分。 https://docs.docker.com/storage/volumes/
这是 docker-compose.yml 的片段。
version: '3'
services:
app:
build:
context: .
args:
- NODE_ENV=production
command: bash -c "node setup.js && npx nodemon server.js"
volumes:
- ./public/temp_upload:/usr/src/app/public/temp_upload
- ./public/upload:/usr/src/app/public/upload
depends_on:
- mysql
- redis
ports:
- 3000:3000
...
关于node.js - 如何将文件上传到dockerized Node.js容器(服务器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60732054/