视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
vue使用el-upload上传文件及Feign服务间传递文件的方法
2020-11-27 22:00:07 责编:小采
文档


一、前端代码

<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接口自动注入,正常使用就行了。

下载本文
显示全文
专题