我尝试使用NEST.JS和MULTER制作一个简单的文件上传REST接口-但它不起作用。我可以将二进制文件 debug.log 发布到URL,并且看到“ Hello undefined”消息,但是在给定的文件夹 uploads 也不会因为扩展名不正确而被拒绝-根据文件过滤器。 但是,没有显示异常或错误。
为什么multer不起作用? 为什么 @Uploadedfile()文件显示为未定义?
谢谢
import { Controller, Post, Request, UseInterceptors, FileInterceptor, UploadedFile, HttpCode, HttpException, HttpStatus } from '@nestjs/common';
import { diskStorage, File } from 'multer';
const path = require('path');
const myStorage = diskStorage({
destination: function (req, file, callback) {
callback(null, './uploads/');
},
limits: { fileSize: 1000000 },
fileFilter: function (req, file, cb) {
const extension = path.extname(file.originalname).toLowerCase()
const mimetyp = file.mimetype
if (extension !== '.jpg' || mimetyp !== 'image/jpg') {
cb(new HttpException('Only images are allowed', HttpStatus.NOT_ACCEPTABLE));
}
cb(null, true);
},
filename: function (req, file, callback) {
callback(null, file.fieldname + '_' + Date.now() + '.jpg');
}
});
@Controller('documents')
export class DocumentsController {
@Post()
@HttpCode(HttpStatus.OK)
@UseInterceptors(FileInterceptor('file', { storage: myStorage }))
public async addDocument(@UploadedFile() file): Promise<any> {
console.log("Hello " + file);
}
}
答案 0 :(得分:0)
我知道问这个问题的人回复晚了,但答案是给未来将要面对的人。
首先检查nestjs documentation
如果 MulterModule
在 *.module.ts
文件中注册,它会在 src
文件夹之外创建上传目录。这是一个很好的做法。
MulterModule.register({
dest: './upload',
});
如果需要更改目标目录,请使用 destination: String|callback
中的 DiskStorageOptions
或 dest:string
中的 FileInterceptor
。对于上传路径,请使用 src/../upload
之类的方式将文件夹保留在 src
目录之外。
问题中提到的上述代码的其他问题:
原因 console.log("Hello " + file);
此处的文件是 Object
并尝试与 String
连接。
将其更改为 console.log("Hello ", file);
扩展名不正确,未显示异常或错误
fileFilter: function (req, file, cb) {
const extension = path.extname(file.originalname).toLowerCase()
const mimetyp = file.mimetype
if (extension !== '.jpg' || mimetyp !== 'image/jpg') {
cb(new HttpException('Only images are allowed', HttpStatus.NOT_ACCEPTABLE));
}
cb(null, true);
}
这里需要添加一个return
。