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 相关文章推荐
Prototype中dom对象方法汇总
Sep 17 Javascript
几个比较实用的JavaScript 测试及效验工具
Apr 18 Javascript
在浏览器中获取当前执行的脚本文件名的代码
Jul 19 Javascript
JavaScript 函数replace深入了解
Mar 14 Javascript
实例分析javascript中的call()和apply()方法
Nov 28 Javascript
jquery实现简单的轮换出现效果实例
Jul 23 Javascript
Bootstrap carousel轮转图的使用实例详解
May 17 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
Jul 04 Javascript
jquery radio 动态控制选中失效问题的解决方法
Feb 28 jQuery
如何从零开始利用js手写一个Promise库详解
Apr 19 Javascript
angular 用Observable实现异步调用的方法
Dec 27 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
Jun 19 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学习笔记之二 php入门知识
2011/01/12 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
js闭包用法实例详解
2016/12/13 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
vue-cli3中vue.config.js配置教程详解
2019/05/29 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
jquery实现淡入淡出轮播图效果
2020/12/13 jQuery
Python通过正则表达式选取callback的方法
2015/07/18 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
python如何以表格形式打印输出的方法示例
2019/06/21 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
python同步两个文件夹下的内容
2019/08/29 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
python 读取数据库并绘图的实例
2019/12/03 Python
如何理解python中数字列表
2020/05/29 Python
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
我们的节日清明节活动方案
2014/03/05 职场文书
会计工作总结范文2014
2014/12/23 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
详解Java实现设计模式之责任链模式
2021/06/23 Java/Android
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android
Go语言基础函数基本用法及示例详解
2021/11/17 Golang