Egg: ctx.getFileStream()获取文件流出错

Created on 11 Jul 2017  ·  12Comments  ·  Source: eggjs/egg

目前我想上传一个文件到egg的服务器上,使用了FormData对象,包裹了一个blob(这个不是通过input type=“file”获取而来)
const formData = new FormData();
formData.append(fileName, blob);
这个blob对象,是通过FileReader的方法readAsArrayBuffer读取文件的二进制形式。
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function (res) {
var buf = new Uint8Array(this.result);
console.info(buf); //[228, 184, 173, 230, 150, 135, 229, 173, 151, 231, 172, 166, 228, 184, 178]...
var blob = new Blob([buf]);
}
使用post请求,发送formData 给egg服务器,egg使用ctx.getFileStream()获取文件流,出现了Invalid filename: blob这个错误,这是什么原因?
请问还有其他方法获取上传的文件流吗?

Most helpful comment

是因为 egg-multipart 阻止无扩展名? https://github.com/eggjs/egg/issues/774

配置以下 fileExtensions

config.multipart = {
    fileExtensions: ['']
}

All 12 comments

https://github.com/eggjs/examples/tree/master/multipart 按这个例子写吧,传统的方式比较简单。

上传文件有扩展名的白名单限制,请修改文件扩展名。 https://eggjs.org/zh-cn/basics/controller.html#获取上传的文件

@popomore 这个例子是使用input type="file"获取到文件,以form表单的形式提交到后台。
这个方法可以实现,但是现在我使用移动端,不采用这种方式获取到文件。

@dead-horse 目前上传的是图片,白名单中默认有支持'.jpg', '.jpeg','.png'等图片的格式
我也没有使用如下方式覆盖白名单
module.exports = {
multipart: {
whitelist: [ '.png' ], // 覆盖整个白名单,只允许上传 '.png' 格式
},
};

@popomore @dead-horse 转换成blob的这种方法我解决了,谢谢2位的解答

@michaelouyang777 是否可以贴一下您的解决方案呢

@michaelouyang777 请问是如何解决的呀

是因为 egg-multipart 阻止无扩展名? https://github.com/eggjs/egg/issues/774

配置以下 fileExtensions

config.multipart = {
    fileExtensions: ['']
}

@popomore @dead-horse 转换成blob的这种方法我解决了,谢谢2位的解答

大佬你好,我也遇到了同样的问题,还是解决不了,请问你是怎么解决的呀,能不能教一下?

我针对这个写了个中间件,用原生的方法处理后直接就可以在body中获取了,你看一下
return async function(ctx,next){
await new Promise((resolve, reject) => {
try {
let obuffer = '';
ctx.req.on('data', (chunk) => {
obuffer = chunk;
})
ctx.req.on('end', () => {
if(obuffer){
ctx.request.body = obuffer;
}
resolve(ctx)
})
} catch (err) {
reject(err)
}
});
await next();
}

如果觉得 stream 太难的话,就用 file 模式吧,看文档。

我今天要遇到了,由于IE11不支持File的contructor,所以对于base64的图片就由Blob转成File,这样就可以上传了,
但是在Eggjs报 Invalid name: blob. 原因是FormData.append('file', file)的时候未指定第三个参数,在IE11中Blob文件的默认文件名是'blob'.由于没有后缀名就被Eggjs拦截报错了.
正确的写法是FormData.append('file', file, file.name); 这样就可以处理IE11上传Blob数据时的问题了.

Was this page helpful?
0 / 5 - 0 ratings