【转载】egg

const { ctx } = this;

console.log(ctx.request.body);

console.log(‘got %d files’, ctx.request.files.length);

for (const file of ctx.request.files) {

console.log('field: ’ + file.fieldname);

console.log('filename: ’ + file.filename);

console.log('encoding: ’ + file.encoding);

console.log('mime: ’ + file.mime);

console.log('tmp filepath: ’ + file.filepath);

let result;

try {

// 处理文件,比如上传到云端

result = await ctx.oss.put(‘egg-multipart-test/’ + file.filename, file.filepath);

} finally {

// 需要删除临时文件

await fs.unlink(file.filepath);

}

console.log(result);

}

}

};

  • [](()Stream 模式:

如果你对于 Node 中的 Stream 模式非常熟悉,那么你可以选择此模式。在 Controller 中,我们可以通过 ctx.getFileStream() 接口能获取到上传的文件流。

  1. 上传 / 接受单个文件:

title:

file:

Upload

const path = require(‘path’);

const sendToWormhole = require(‘stream-wormhole’);

const Controller = require(‘egg’).Controller;

class UploaderController extends Controller {

async upload() {

const ctx = this.ctx;

const stream = await ctx.getFileStream();

const name = ‘egg-multipart-test/’ + path.basename(stream.filename);

// 文件处理,上传到云存储等等

let result;

try {

result = await ctx.oss.put(name, stream);

} catch (err) {

// 必须将上传的文件流消费掉,要不然浏览器响应会卡死

await sendToWormhole(stream);

throw err;

}

ctx.body = {

url: result.url,

// 所有表单字段都能通过 stream.fields 获取到

fields: stream.fields,

};

}

}

module.exports = UploaderController;

要通过 ctx.getFileStream 便捷的获取到用户上传的文件,需要满足两个条件:

  • 只支持上传一个文件。

  • 上传文件必须在所有其他的 fields 后面,否则在拿到文件流时可能还获取不到 fields。

  1. 上传 / 接受多个文件:

如果要获取同时上传的多个文件,不能通过 ctx.getFileStream() 来获取,只能通过下面这种方式:

const sendToWormhole = require(‘stream-wormhole’);

const Controller = require(‘egg’).Controller;

class UploaderController extends Controller {

async upload() {

const ctx = this.ctx;

const parts = ctx.multipart();

let part;

// parts() 返回 promise 对象

while ((part = await parts()) != null) {

if (part.length) {

// 这是 busboy 的字段

console.log('field: ’ + part[0]);

console.log('value: ’ + part[1]);

console.log('valueTruncated: ’ + part[2]);

console.log('fieldnameTruncated: ’ + part[3]);

} else {

if (!part.filename) {

// 这时是用户没有选择文件就点击了上传(part 是 file stream,但是 part.filename 为空)

// 需要做出处理,例如给出错误提示消息

return;

}

// part 是上传的文件流

console.log('field: ’ + part.fieldname);

console.log('filename: ’ + part.filename);

console.log('encoding: ’ + part.e 《大厂前端面试题解析+Web核心总结学习笔记+企业项目实战源码+最新高清讲解视频》无偿开源 徽信搜索公众号【编程进阶路】 ncoding);

console.log('mime: ’ + part.mime);

// 文件处理,上传到云存储等等

let result;

try {

result = await ctx.oss.put(‘egg-multipart-test/’ + part.filename, part);

} catch (err) {

// 必须将上传的文件流消费掉,要不然浏览器响应会卡死

await sendToWormhole(part);

throw err;

}

console.log(result);

}

}

console.log(‘and we are done parsing the form!’);

}

}

module.exports = UploaderController;

为了保证文件上传的安全,框架限制了支持的的文件格式,框架默认支持白名单如下:

// images

‘.jpg’, ‘.jpeg’, // image/jpeg

‘.png’, // image/png, image/x-png

‘.gif’, // image/gif

‘.bmp’, // image/bmp

‘.wbmp’, // image/vnd.wap.wbmp

‘.webp’,

‘.tif’,

‘.psd’,

// text

‘.svg’,

‘.js’, ‘.jsx’,

‘.json’,

‘.css’, ‘.less’,

‘.html’, ‘.htm’,

‘.xml’,

// tar

‘.zip’,

‘.gz’, ‘.tgz’, ‘.gzip’,

// video

‘.mp3’,

‘.mp4’,

‘.avi’,

用户可以通过在 config/config.default.js 中配置来新增支持的文件扩展名,或者重写整个白名单

  • 新增支持的文件扩展名

module.exports = {

multipart: {

fileExtensions: [ ‘.apk’ ] // 增加对 apk 扩展名的文件支持

},

};

  • 覆盖整个白名单
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值