egg-multipart有两种模式:file和stream

el-upload参数传递有两种方式:利用自带参数data和手动添加参数

egg-multipart介绍

一、file 模式下的带参传递

1、egg配置
  1. // config.default.js
  2. exports.multipart = {
  3. mode: 'file',
  4. allowArrayField: true,
  5. fileSize: '5mb',
  6. };
2、前端配置
  1. <el-upload
  2. :action="url"
  3. :data="uploadData"
  4. list-type="picture-card"
  5. :on-preview="handlePictureCardPreview"
  6. :before-remove="handleBeforeRemove"
  7. :on-success="uploadSuccess"
  8. :before-upload="beforeUpload"
  9. :on-change="changeUpload"
  10. accept=".jpg,.jpeg,.png,.gif,.bmp,.JPG,.JPEG,.PBG,.GIF,.BMP"
  11. >

其中,uploadData为Object

uploadData: { test: '111111111' },

3、egg后台
  1. // app/controller/upload.js
  2. const Controller = require('egg').Controller;
  3. const fs = require('mz/fs');
  4. const path = require('path');
  5. const oss = require('ali-oss');
  6. const crypto = require('crypto');
  7. module.exports = class extends Controller {
  8. async upload() {
  9. const { ctx } = this;
  10. const file = ctx.request.files[0];
  11. // 获取传递的参数
  12. console.log(ctx.request.body);
  13. // 配置阿里云oss
  14. const client = new oss({
  15. accessKeyId: this.config.aliyun.accessKeyId,
  16. accessKeySecret: this.config.aliyun.secretAccessKey,
  17. bucket: 'xxxx',
  18. region: 'xxx',
  19. });
  20. // 获取后缀
  21. const extname = path.extname(file.filename)
  22. .toLocaleLowerCase();
  23. // 生成唯一的文件名
  24. const md5 = crypto.createHash('md5');
  25. const timestamp = (new Date()).getTime(); // 当前时间戳
  26. const randomNum = Math.ceil(Math.random() * 1000); // 取1000以下的随机数
  27. const filename = md5.update(path.basename(file.filename, extname) + timestamp + randomNum)
  28. .digest('hex') + extname;
  29. try {
  30. // 处理文件,比如上传到云端
  31. const result = await client.putStream(filename, file.filepath);
  32. ctx.body = {
  33. code: 200,
  34. result
  35. };
  36. } catch(e){
  37. // 需要删除临时文件
  38. await fs.unlink(file.filepath);
  39. ctx.body = {
  40. code: 110,
  41. msg:e
  42. };
  43. }
  44. }
  45. };

二、stream 模式

1、egg配置
  1. // config.default.js
  2. exports.multipart = {
  3. mode: 'stream',
  4. allowArrayField: true,
  5. fileSize: '5mb',
  6. };
2、前端配置不变
3、egg
  1. const path = require('path');
  2. const sendToWormhole = require('stream-wormhole');
  3. const Controller = require('egg').Controller;
  4. class UploaderController extends Controller {
  5. async upload() {
  6. const ctx = this.ctx;
  7. const stream = await ctx.getFileStream();
  8. // 获取参数
  9. console.log(stream.fields);
  10. if (!stream.filename) {
  11. ctx.body = {
  12. code: 110,
  13. msg: '上传失败,请重新尝试',
  14. };
  15. return;
  16. }
  17. // 配置阿里云oss
  18. const client = new oss({
  19. accessKeyId: this.config.aliyun.accessKeyId,
  20. accessKeySecret: this.config.aliyun.secretAccessKey,
  21. bucket: 'xxxx',
  22. region: 'xxx',
  23. });
  24. // 获取后缀
  25. const extname = path.extname(file.filename)
  26. .toLocaleLowerCase();
  27. // 生成唯一的文件名
  28. const md5 = crypto.createHash('md5');
  29. const timestamp = (new Date()).getTime(); // 当前时间戳
  30. const randomNum = Math.ceil(Math.random() * 1000); // 取1000以下的随机数
  31. const filename = md5.update(path.basename(file.filename, extname) + timestamp + randomNum)
  32. .digest('hex') + extname;
  33. try {
  34. const result = await client.putStream(filename, stream);
  35. ctx.body = {
  36. code: 200,
  37. result,
  38. };
  39. } catch (err) {
  40. console.log(err);
  41. await sendToWormhole(stream);
  42. ctx.body = {
  43. code: 110,
  44. msg: '上传失败',
  45. };
  46. }
  47. ctx.body = {
  48. url: result.url,
  49. // 所有表单字段都能通过 `stream.fields` 获取到
  50. fields: stream.fields,
  51. };
  52. }
  53. }
  54. module.exports = UploaderController;

三、手动传参

如果不通过el-upload的data进行传参,可以手动传参,但是手动传参需要注意一下几点:

1、header设置为formdata格式
  1. headers: {
  2. 'Content-Type': 'multipart/form-data'
  3. }

axios封装后的请求为:

  1. export function upload(data) {
  2. return request({
  3. url: '你的路径',
  4. method: 'post',
  5. Headers: { 'Content-Type': 'multipart/form-data' },
  6. data
  7. })
  8. }
2、formdata添加参数方式:
  1. const fileFormData = new FormData()
  2. fileFormData.append('id', '111111111')
  3. fileFormData.append('file', this.file_name)

其中,file_name为:file的raw

  1. changeUpload(file) {
  2. console.log(file)
  3. this.file_name = file.raw
  4. },

欢迎关注,共同交流前端知识~

egg-multipart + el-upload 实现带参图片上传至阿里云OSS的更多相关文章

  1. C# .net Ueditor实现图片上传到阿里云OSS 对象存储

    在学习的时候,项目中需要实现在Ueditor编辑器中将图片上传到云储存中,老师演示的是上传到又拍云存储,既然看了一遍,直接照搬不算本事,咱们可以依葫芦画瓢自己来动手玩玩其它的云存储服务. 现在云计算产 ...

  2. 保姆级SpringBoot+Vue图片上传到阿里云OSS教程

    小二是新来的实习生,作为技术 leader,我给他安排了一个非常简单的练手任务,把前端 markdown 编辑器里上传的图片保存到服务器端,结果他真的就把图片直接保存到了服务器上,这下可把我气坏了,就 ...

  3. 图片的URL上传至阿里云OSS操作(微信小程序二维码返回的二进制上传到OSS)

    当我们从网络中获取一个URL的图片我们要存储到本地或者是私有的云时,我们可以这样操作  把url中的图片文件下载到本地(或者上传到私有云中)  public String uploadUrlToOss ...

  4. Vue 将本地图片上传到阿里云

    一.获取服务器通行证(即获取AccessKey和accessKeySecret) getAccess () { let that = this let url = '服务器地址' let params ...

  5. vue-quill-editor + element-ui upload实现富文本图片上传

    代码贴上 <template> <div class="quill-editor-example"> <div class="box&quo ...

  6. Httpclient 实现带参文件上传

    这里直接贴出的是我封装好的doPostFile方法,httpclient 的版本是3.1. public static String doPostFile(String url, Part[] par ...

  7. 使用fastadmin系统自带的图片上传plupload

    首先,form表单需要具有如下代码 <form class="form-horizontal" role="form" method="POST ...

  8. easyUI-filebox图片上传和预览

    转载自:https://blog.csdn.net/nvxiaq/article/details/77740516 备注: 1.如需上传多个图片可定义多个change_photo函数 在onChang ...

  9. ThinkPHP图片上传

    ThinkPHP是国内比较流行的轻量级的PHP框架,它在国内流行的一个最主要的因素在于它的说明文档非常健全完善,以及它源码内的注释都是中文的,方便于英语能力较差的程序员学习. 图片上传在网站里是很常用 ...

随机推荐

  1. JavaBean基本概念

    JavaBean 是特殊的 Java 类,使用 Java 语言书写,并且遵守 JavaBean API 规范. JavaBean 与其它 Java 类相比而言独一无二的特征: 提供一个默认的无参构造函 ...

  2. SSH 远程访问及控制 ( 早上好,我是派大星,上帝派来爱你的那颗星)

    远程访问及控制 1.SSH远程管理,TCP Wrappers访问控制 2.配置密钥对验证 1.SSH远程管理,TCP访问控制 SSH是一种安全通道协议,主要用来实现字符界面的远程登录.远程复制等功能: ...

  3. hgame-week3-web-wp

    hgame第三周(web ak) 1.SecurityCenter 先看看hint(**vendor是第三方库和插件放置的文件夹,一般来源于composer的安装) 找到了使用的twig模板,应该是t ...

  4. 简单的springboot + vue

    安装vue 脚手架 npm install -g @vue/cli 查看vue 版本 vue -V 创建vue项目 vue create vue_project Vue CLI v4.5.13? Pl ...

  5. Redis 忽然变慢了如何排查并解决?

    Redis 通常是我们业务系统中一个重要的组件,比如:缓存.账号登录信息.排行榜等. 一旦 Redis 请求延迟增加,可能就会导致业务系统"雪崩". 我在单身红娘婚恋类型互联网公司 ...

  6. python3发微信脚本

    企业微信发微信脚本 #!/usr/bin/env python # -*- coding: utf-8 -*- #GuoYabin import requests,json,sys,imp imp.r ...

  7. 数据分析实际案例之:pandas在泰坦尼特号乘客数据中的使用

    目录 简介 泰坦尼特号乘客数据 使用pandas对数据进行分析 引入依赖包 读取和分析数据 图形化表示和矩阵转换 简介 1912年4月15日,号称永不沉没的泰坦尼克号因为和冰山相撞沉没了.因为没有足够 ...

  8. 『德不孤』Pytest框架 — 4、Pytest跳过测试用例

    目录 1.无条件跳过skip 2.有条件跳过skipif 3.练习 自动化测试执行过程中,我们常常出现这种情况:因为功能阻塞,未实现或者环境有问题等等原因,一些用例执行不了, 如果我们注释掉或删除掉这 ...

  9. “百度杯”CTF比赛 九月场Upload

    首先生成一个php文件以下源代码: <script language="PHP">$fh=fopen("../flag.".strtolower(& ...

  10. python-can库基于PCAN-USB使用方法

    一.概述 1.介绍 python-can库为Python提供了控制器局域网的支持,为不同的硬件设备提供了通用的抽象,并提供了一套实用程序,用于在CAN总线上发送和接收消息. 支持硬件接口: Name ...