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 相关文章推荐
Extjs学习笔记之六 面版
Jan 08 Javascript
在多个页面使用同一个HTML片段的代码
Mar 04 Javascript
js实现背景图自适应窗口大小
Jan 10 Javascript
js正则表达式验证表单【完整版】
Mar 06 Javascript
微信小程序 页面跳转事件绑定的实例详解
Sep 20 Javascript
vue之浏览器存储方法封装实例
Mar 15 Javascript
AngularJS 应用模块化的使用
Apr 04 Javascript
vue实现重置表单信息为空的方法
Sep 29 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
Jun 13 Javascript
Nuxt页面级缓存的实现
Mar 09 Javascript
详解vue父子组件状态同步的最佳方式
Sep 10 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
Jan 29 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
php daodb插入、更新与删除数据
2009/03/19 PHP
php权重计算方法代码分享
2014/01/09 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
取得一定长度的内容,处理中文
2006/12/20 Javascript
Jquery 扩展方法
2010/05/06 Javascript
jQuery之按钮组件的深入解析
2013/06/19 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
BACKBONE.JS 简单入门范例
2017/10/17 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
[02:21]2018完美盛典章节片——初心
2018/12/17 DOTA
Python中使用PIPE操作Linux管道
2015/02/04 Python
Python匹配中文的正则表达式
2016/05/11 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
python发送邮件脚本
2018/05/22 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
PyQt5 界面显示无响应的实现
2020/03/26 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
工程力学硕士生的自我评价范文
2013/11/16 职场文书
文明餐桌行动实施方案
2014/02/19 职场文书
初中班主任评语
2014/04/24 职场文书
心理健康活动总结
2014/04/30 职场文书
公民授权委托书
2014/10/15 职场文书
2014年客房部工作总结
2014/11/22 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
男方婚前保证书
2015/02/28 职场文书
储备店长岗位职责
2015/04/14 职场文书
《孙子兵法》:欲成大事者,需读懂这些致胜策略
2019/08/23 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python