我正在使用Multer作为Express中间件。在我的示例中,我正在检查文件扩展名和mimetype是否正确(对于wave文件),如果不正确,我想用415进行响应。但是,我不知道如何使用Multer的<i>
getSelectedImages = (selectedImages, currentImage)=>{
const image = this.state.uri
let uploadBlob = null
let mime = 'image/jpg'
const originalXMLHttpRequest = window.XMLHttpRequest;
const originalBlob = window.Blob;
window.XMLHttpRequest = RNFetchBlob.polyfill.XMLHttpRequest
window.Blob = RNFetchBlob.polyfill.Blob
const imageRef = firebase.storage().ref('posts').child(this.state.uri)
RNFetchBlob.fs.readFile(image, 'base64')
.then((data) => {
return Blob.build(data, { type: `${mime};BASE64` })
})
.then((blob) => {
uploadBlob = blob
return imageRef.put(blob, { contentType: mime })
})
.then(() => {
uploadBlob.close()
window.XMLHttpRequest = originalXMLHttpRequest ;
window.Blob = originalBlob
return imageRef.getDownloadURL()
})
.then((url) => {
firebase.database().ref('groub').child(params.chat).child('message').push({
createdAt:firebase.database.ServerValue.TIMESTAMP,
image:url,
user:{
_id:params.id,
name:params.name,
},
})
alert('Upload Sukses')
})
.catch((error) => {
console.log(error);
})
}
</i>
来执行此操作,因此我正在检查文件是否存在于路由器处理程序的请求对象中,这有点尴尬。另外也许将来我想实现不同的fileFilter
和错误代码。是否有建议的模式用于在Express中使用Multer设置响应状态?
fileFilter
答案 0 :(得分:1)
您可以这样做:
const upload = multer({
dest: 'uploads/',
fileFilter: function (req, file, cb) {
const filetypes = /wave|wav/;
const mimetype = filetypes.test(file.mimetype);
const extname = filetypes.test(
path.extname(file.originalname).toLowerCase());
if (mimetype && extname) {
cb(undefined, true);
} else {
req.notWAVEMimeType = 'Only audio/wav files are supported.';
return cb(undefined, false);
}
}
});
router.post('/', upload.single('wave'), (req, res) => {
if (req.notWAVEMimeType) {
return res.status(415).end(req.notWAVEMimeType);
}
// Do some async task with file
return res.sendStatus(200);
});
通过请求对象上的notWAVEMimeType
属性,您可以将错误消息返回到POST方法。据此,您可以添加其他mime类型,然后检查req
的相关属性的存在。