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 相关文章推荐
jQuery使用手册之 事件处理
Mar 24 Javascript
给Function做的OOP扩展
May 07 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
Dec 11 Javascript
jquery 操作日期、星期、元素的追加的实现代码
Feb 07 Javascript
JavaScript中获取鼠标位置相关属性总结
Oct 11 Javascript
Juery解决tablesorter中文排序和字符范围的方法
May 06 Javascript
JS常见算法详解
Feb 28 Javascript
Vue自定义事件(详解)
Aug 19 Javascript
详解webpack编译多页面vue项目的配置问题
Dec 11 Javascript
vue 本地服务不能被外部IP访问的完美解决方法
Oct 29 Javascript
微信小程序使用二次贝塞尔曲线画波浪
Dec 25 Javascript
详解JavaScript的数据类型以及数据类型的转换
Apr 20 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 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
smarty半小时快速上手入门教程
2014/10/27 PHP
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
关于document.cookie的使用javascript
2010/10/29 Javascript
再次分享18个非常棒的jQuery表格插件
2011/04/10 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
Node.js安装配置图文教程
2017/05/10 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
2020/03/26 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
python 实现表情识别
2020/11/21 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
向领导表决心的话
2014/03/11 职场文书
党员教师工作决心书
2014/03/13 职场文书
公益广告标语
2014/06/19 职场文书
学校安全管理责任书
2014/07/23 职场文书
学校关爱留守儿童活动方案
2014/08/27 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
铁人纪念馆观后感
2015/06/16 职场文书
五一晚会主持词
2015/07/01 职场文书
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs
Mysql外键约束的创建与删除的使用
2022/03/03 MySQL
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫