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

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

egg-multipart介绍

一、file 模式下的带参传递

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

其中,uploadData为Object

uploadData: { test: '111111111' },

3、egg后台
// app/controller/upload.js
const Controller = require('egg').Controller;
const fs = require('mz/fs');
const path = require('path');
const oss = require('ali-oss');
const crypto = require('crypto'); module.exports = class extends Controller {
async upload() {
const { ctx } = this;
const file = ctx.request.files[0]; // 获取传递的参数
console.log(ctx.request.body); // 配置阿里云oss
const client = new oss({
accessKeyId: this.config.aliyun.accessKeyId,
accessKeySecret: this.config.aliyun.secretAccessKey,
bucket: 'xxxx',
region: 'xxx',
}); // 获取后缀
const extname = path.extname(file.filename)
.toLocaleLowerCase(); // 生成唯一的文件名
const md5 = crypto.createHash('md5');
const timestamp = (new Date()).getTime(); // 当前时间戳
const randomNum = Math.ceil(Math.random() * 1000); // 取1000以下的随机数
const filename = md5.update(path.basename(file.filename, extname) + timestamp + randomNum)
.digest('hex') + extname; try {
// 处理文件,比如上传到云端
const result = await client.putStream(filename, file.filepath);
ctx.body = {
code: 200,
result
};
} catch(e){
// 需要删除临时文件
await fs.unlink(file.filepath);
ctx.body = {
code: 110,
msg:e
};
}
}
};

二、stream 模式

1、egg配置
// config.default.js
exports.multipart = {
mode: 'stream',
allowArrayField: true,
fileSize: '5mb',
};
2、前端配置不变
3、egg
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(); // 获取参数
console.log(stream.fields); if (!stream.filename) {
ctx.body = {
code: 110,
msg: '上传失败,请重新尝试',
};
return;
} // 配置阿里云oss
const client = new oss({
accessKeyId: this.config.aliyun.accessKeyId,
accessKeySecret: this.config.aliyun.secretAccessKey,
bucket: 'xxxx',
region: 'xxx',
}); // 获取后缀
const extname = path.extname(file.filename)
.toLocaleLowerCase(); // 生成唯一的文件名
const md5 = crypto.createHash('md5');
const timestamp = (new Date()).getTime(); // 当前时间戳
const randomNum = Math.ceil(Math.random() * 1000); // 取1000以下的随机数
const filename = md5.update(path.basename(file.filename, extname) + timestamp + randomNum)
.digest('hex') + extname; try {
const result = await client.putStream(filename, stream);
ctx.body = {
code: 200,
result,
};
} catch (err) {
console.log(err);
await sendToWormhole(stream);
ctx.body = {
code: 110,
msg: '上传失败',
};
} ctx.body = {
url: result.url,
// 所有表单字段都能通过 `stream.fields` 获取到
fields: stream.fields,
};
}
} module.exports = UploaderController;

三、手动传参

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

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

axios封装后的请求为:

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

其中,file_name为:file的raw

      changeUpload(file) {
console.log(file)
this.file_name = file.raw
},

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

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. jvm与dvm两种虚拟机的不同

    jvm : java虚拟机 sun dvm:  dalvik虚拟机  google     区别:         1.基于的架构不同,jvm 基于栈架构,栈是位于内存上的一个空间,执行指令操作,需要 ...

  2. php include,require,include_once,require_once 的区别

    include(),require(),include_once(),require_once()作用都是包含并运行指定文件,但是使用场景又有很大区别. 1.include()和require()的区 ...

  3. linux计划任务之cron

    目录 cron计划任务之用户级 cron计划任务之系统级 cron计划任务之用户级 1.安装crond centos7 执行命令: # yum install -y crontabs /bin/sys ...

  4. CVE-2021-4034 Linux Polkit本地权限提升漏洞

    0x00 前言 公司放假两天,突然一天下午,群里面实验室的大哥发了个通告,就是这个臭名昭著刚爆出来的漏洞.通杀目前市场上大多数Linux操作系统.随后我看到各种微信公众号纷纷发表文章,POC已经出现了 ...

  5. MySQL高级篇笔记

    目录 MySQL体系结构 存储引擎特点 InnoDB底层文件 MyISAM底层文件 索引 慢查询日志 profile详情 explain执行计划 EXPLAIN 执行计划各字段含义: 索引使用 最左前 ...

  6. Linux目录结构详细

    今日内容 解析映射文件 在 window 和 Linux 系统中都有解析文件,一般名为 host,存放在配置目录 etc 中 在本地机访问网络输入域名时,首先会解析 host 文件,如果域名有对应的i ...

  7. Solution -「LOCAL」画画图

    \(\mathcal{Description}\)   OurTeam.   给定一棵 \(n\) 个点的树形随机的带边权树,求所有含奇数条边的路径中位数之和.树形生成方式为随机取不连通两点连边直到全 ...

  8. 自学linux(安装系统,图形化界面,安装chrome)STEP1

    1. 下载虚拟机VMware并安装 破解版: https://www.xitmi.com/2417.html 2. 下载centos7,6据说已经找不到了? 阿里云镜像: https://mirror ...

  9. mysql基础复习(SQL语句的四个分类),

                                                                                                       ( ...

  10. Abp 异常处理

    Abp 异常处理 最近一直在读代码整洁之道,我在读到第三章函数的3.9 使用异常替代返回错误码,其实在我的开发经历中都是使用返回错误码给到前端,之前在阅读ABP官网文档中就有看到过使用异常替代异常的做 ...