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 相关文章推荐
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
Jun 19 Javascript
javascript实现信息增删改查的方法
Jul 25 Javascript
JavaScript几种数组去掉重复值的方法推荐
Apr 12 Javascript
BootStrap3学习笔记(一)之网格系统
May 20 Javascript
AngularJS入门教程之路由与多视图详解
Aug 19 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
Oct 10 Javascript
jquery 判断是否支持Placeholder属性的方法
Feb 07 Javascript
vue动态生成dom并且自动绑定事件
Apr 19 Javascript
Vue中保存用户登录状态实例代码
Jun 07 Javascript
JS实现商品筛选功能
Aug 19 Javascript
JS实现烟花爆炸效果
Mar 10 Javascript
JavaScript架构localStorage特殊场景下二次封装操作
Jun 21 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
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
PHP图片上传代码
2013/11/04 PHP
php下获取http状态的实现代码
2014/05/09 PHP
php操作(删除,提取,增加)zip文件方法详解
2015/03/12 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
PHP图片加水印实现方法
2016/05/06 PHP
PHP页面跳转操作实例分析(header方法)
2016/09/28 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
Jquery 1.42 checkbox 全选和反选代码
2010/03/27 Javascript
Jquery 的扩展方法总结
2011/10/01 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
初步使用Node连接Mysql数据库
2016/03/03 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
layer弹窗插件操作方法详解
2017/05/19 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
彻彻底底地理解Python中的编码问题
2018/10/15 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
海淘零差价,宝贝全球购: 宝贝格子
2016/08/24 全球购物
毕业生的自我评价范文
2013/12/31 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
骨干教师培训方案
2014/05/06 职场文书
求职信标题怎么写
2014/05/26 职场文书
同意报考证明
2015/06/17 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
Python 高级库15 个让新手爱不释手(推荐)
2021/05/15 Python