vue使用el-upload上传文件及Feign服务间传递文件的方法


Posted in Javascript onMarch 15, 2019

一、前端代码

<el-upload class="step_content" drag
         action="string"
         ref="upload"
         :multiple="false"
         :http-request="createAppVersion"
         :data="appVersion"
         :auto-upload="false"
         :limit="1"
         :on-change="onFileUploadChange"
         :on-remove="onFileRemove">
    <i class="el-icon-upload"></i>
    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>

</el-upload>

 <div class="mgt30">
    <el-button v-show="createAppVisible" :disabled="createAppDisable" type="primary" class="mgt30"
          @click="onSubmitClick">立即创建
    </el-button>
 </div>

....

 onSubmitClick() {
    this.$refs.upload.submit();
   },

   createAppVersion(param) {
    this.globalLoading = true;

    const formData = new FormData();
    formData.append('file', param.file);
    formData.append('appVersion', JSON.stringify(this.appVersion));

    addAppVersionApi(formData).then(res => {
     this.globalLoading = false;
     this.$message({message: '创建APP VERION 成功', type: 'success'});
     this.uploadFinish();
    }).catch(reason => {
     this.globalLoading = false;
     this.showDialog(reason);
    })

   },

说明:

  1. el-upload 的 ref="upload" 给这个组件起个变量名,以便 js逻辑代码可以引用
  2. http-request="createAppVersion" el-upload 上传使使用自定义的方法
  3. :data="appVersion" 上传时提交的表单数据
  4. onSubmitClick 方法中会调用el-upload.submit()方法,进而调用createAppVersion()方法
  5. 组成表单参数,取得上传的file 和 其它参数
const formData = new FormData();
formData.append('file', param.file);
formData.append('appVersion', JSON.stringify(this.appVersion));

6.addAppVersionApi 最终会调用下面的方法,其中formData就是param, 请求需要加header: 'Content-Type': 'multipart/form-data'

function httpPostMutipartFileAsyn(url, param) {
 return new Promise((resolve, reject) => {
  request({
   url: url,
   headers: {
    'Content-Type': 'multipart/form-data'
   },
   method: 'post',
   data: param
  }).then(response => {
   if (response.data.status.code === 0) {
    resolve(response.data)
   } else {
    reject(response.data.status)
   }
  }).catch(response => {
   reject(response)
  })
 })
}

二、后端代码

1.后端controller接口

@PostMapping("/version/add")
  public RestResult addAppVersion(@RequestParam("appVersion") String appVersion,
                  @RequestParam("file") MultipartFile multipartFile) {

    ....
    
    return new RestResult();
  }

三、Feign 实现服务间传递MultipartFile参数

Controller的addAppVersion()接口,收到上传的文件后,需要通过Http调用远程接口,将文件上传到资源服务。一开始尝试使用OKHttp 和 RestTemplate 实现,但是这两种方法都必须将文件先保存,无法直接传递MultipartFile参数,然后才能通过OKHttp 和 RestTemplate提供的相关接口去实现。 本着不想在本地保存临时文件的,找到了通过Feign解决的一种方式

1.添加如下依赖:

<dependency>
      <groupId>io.github.openfeign.form</groupId>
      <artifactId>feign-form</artifactId>
      <version>3.0.3</version>
    </dependency>

    <dependency>
      <groupId>io.github.openfeign.form</groupId>
      <artifactId>feign-form-spring</artifactId>
      <version>3.0.3</version>
    </dependency>

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.3</version>
    </dependency>

2.Feign 接口实现

@FeignClient(name = "resource-client",url = "http://xxxx",path = "resource",configuration = ResourceServiceFeignClient.MultipartSupportConfig.class)
public interface ResourceServiceFeignClient {

  @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  Resource upload(@RequestPart("file") MultipartFile file);

  class MultipartSupportConfig {
    @Bean
    public Encoder feignFormEncoder() {
      return new SpringFormEncoder();
    }
  }

}

这里Feign是通过url实现的接口调用,并没有通过SpringCloud注册中心服务发现来实现接口调用,因为我所在的项目是独立在服务化体系外的

3.将Feign接口自动注入,正常使用就行了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
23个超流行的jQuery相册插件整理分享
Apr 25 Javascript
精通Javascript系列之数值计算
Jun 07 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
Nov 02 Javascript
jquery遍历标签中自定义的属性方法
Sep 17 Javascript
JS实现微信弹出搜索框 多条件查询功能
Dec 13 Javascript
js实现滑动到页面底部自动加载更多功能
Feb 15 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
Jun 30 Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 Javascript
vue elementUI tree树形控件获取父节点ID的实例
Sep 12 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
Nov 30 Javascript
简单两步使用node发送qq邮件的方法
Mar 01 Javascript
使用node.JS中的url模块解析URL信息
Feb 06 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
Mar 15 #Javascript
浅谈KOA2 Restful方式路由初探
Mar 14 #Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
Mar 14 #Javascript
详解React项目中碰到的IE问题
Mar 14 #Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
Mar 14 #Javascript
React+Antd+Redux实现待办事件的方法
Mar 14 #Javascript
Node.js + express基本用法教程
Mar 14 #Javascript
You might like
类的另类用法--数据的封装
2006/10/09 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
PHP使用glob函数遍历目录或文件夹的方法
2014/12/16 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
浅析JQuery中的html(),text(),val()区别
2014/09/01 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
Python XML RPC服务器端和客户端实例
2014/11/22 Python
Python二分查找详解
2015/09/13 Python
Python提取网页中超链接的方法
2016/09/18 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
Flask框架钩子函数功能与用法分析
2019/08/02 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
学校门卫工作职责
2013/12/07 职场文书
《猫》教学反思
2014/02/26 职场文书
航空学院求职信
2014/06/11 职场文书
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis
js基于div丝滑实现贝塞尔曲线
2022/09/23 Javascript