egg-multipart + el-upload 实现带参图片上传至阿里云OSS
egg-multipart有两种模式:file和stream
el-upload参数传递有两种方式:利用自带参数data和手动添加参数
一、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的更多相关文章
- C# .net Ueditor实现图片上传到阿里云OSS 对象存储
在学习的时候,项目中需要实现在Ueditor编辑器中将图片上传到云储存中,老师演示的是上传到又拍云存储,既然看了一遍,直接照搬不算本事,咱们可以依葫芦画瓢自己来动手玩玩其它的云存储服务. 现在云计算产 ...
- 保姆级SpringBoot+Vue图片上传到阿里云OSS教程
小二是新来的实习生,作为技术 leader,我给他安排了一个非常简单的练手任务,把前端 markdown 编辑器里上传的图片保存到服务器端,结果他真的就把图片直接保存到了服务器上,这下可把我气坏了,就 ...
- 图片的URL上传至阿里云OSS操作(微信小程序二维码返回的二进制上传到OSS)
当我们从网络中获取一个URL的图片我们要存储到本地或者是私有的云时,我们可以这样操作 把url中的图片文件下载到本地(或者上传到私有云中) public String uploadUrlToOss ...
- Vue 将本地图片上传到阿里云
一.获取服务器通行证(即获取AccessKey和accessKeySecret) getAccess () { let that = this let url = '服务器地址' let params ...
- vue-quill-editor + element-ui upload实现富文本图片上传
代码贴上 <template> <div class="quill-editor-example"> <div class="box&quo ...
- Httpclient 实现带参文件上传
这里直接贴出的是我封装好的doPostFile方法,httpclient 的版本是3.1. public static String doPostFile(String url, Part[] par ...
- 使用fastadmin系统自带的图片上传plupload
首先,form表单需要具有如下代码 <form class="form-horizontal" role="form" method="POST ...
- easyUI-filebox图片上传和预览
转载自:https://blog.csdn.net/nvxiaq/article/details/77740516 备注: 1.如需上传多个图片可定义多个change_photo函数 在onChang ...
- ThinkPHP图片上传
ThinkPHP是国内比较流行的轻量级的PHP框架,它在国内流行的一个最主要的因素在于它的说明文档非常健全完善,以及它源码内的注释都是中文的,方便于英语能力较差的程序员学习. 图片上传在网站里是很常用 ...
随机推荐
- C3P0数据库连接池数据库插入中文乱码问题解决
问题描述 近期修改一个学生信息管理的JavaWeb项目,其数据库连接池使用了C3P0.在实际测试时,发现在学生信息模块添加中文学生信息会在数据库(MySQL)出现中文乱码问题. 如图所示: 问题分析 ...
- Android编译implement、api 和compile区别【转】
感谢大佬:https://blog.csdn.net/fengyeNom1/article/details/81903186 前言 2017 年google 后,Android studio 版本更新 ...
- android怎么做表格显示数据
实现思路:最底层(父级)背景为黑色,最上层(子级)背景为白色,然后父子组件之间存在一丝间隔即可显示出类似边框的线. 本次主要利用Android中的TableRow等实现,其他类比也可以实现效果. &l ...
- linux 多个C源文件编译
转载请注明来源:https://www.cnblogs.com/hookjc/ 如果有多个源文件,基本上有两种编译方法: [假设有两个源文件为test.c和testfun.c] 1. 多个文件一起编译 ...
- Java线程--Semaphore使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11872132.html Java线程--Semaphore使用 Semaphore是信号量, ...
- Nginx网站服务 配置
Nginx网站服务 配置 1.编译安装Nginx服务 2.认识Nginx服务的主配置文件nginx.conf 3.访问状态统计配置 4.基于授权的访问控制 5.基于客户端的访问控制 6.基于域名的Ng ...
- 模块random+os+sys+json+subprocess
模块random+os+sys+json+subprocess 1. random 模块 (产生一个随机值) import random 1 # 随机小数 2 print(random.rando ...
- Solution -「多校联训」签到题
\(\mathcal{Description}\) Link. 给定二分图 \(G=(X\cup Y,E)\),求对于边的一个染色 \(f:E\rightarrow\{1,2,\dots,c\ ...
- 【第二十四期】golang 一年经验开发 富途
他们家是按题目来的,从一个小题目慢慢延伸着问,由浅入深,问到你换题为止. 第一题 给了一个网址,解释一下浏览器填入这个网址后发生了什么? TCP为什么要三次握手四次挥手? 502是什么? 如果出现50 ...
- ios开发 将json格式数据上传服务器
看了一些大小牛的资料其实就3步 1.使用post 请求 ,因为get是不能上传的 2.设置请求类型 , 讲你的json数据上传 3.向服务器发送数据按照下面示例代码,就差不多了 1 // 1.创建请求 ...