当前位置: 移动技术网 > IT编程>开发语言>Java > Spring Cloud Feign文件传输的示例代码

Spring Cloud Feign文件传输的示例代码

2019年07月19日  | 移动技术网IT编程  | 我要评论
一、配置文件解析器 服务提供者和消费者都需要配置文件解析器,这里使用 commons-fileupload 替换原有的解析器: 依赖: <depen

一、配置文件解析器

服务提供者和消费者都需要配置文件解析器,这里使用 commons-fileupload 替换原有的解析器:

依赖:

<dependency>
  <groupid>commons-fileupload</groupid>
  <artifactid>commons-fileupload</artifactid>
  <version>1.3.1</version>
</dependency>

注入 bean :

@bean(name = "multipartresolver")
public multipartresolver mutipartresolver(){
  commonsmultipartresolver com = new commonsmultipartresolver();
  com.setdefaultencoding("utf-8");
  return com;
}

程序入口中剔除原有的解析器:

@springbootapplication(exclude = {multipartautoconfiguration.class})

二、服务提供者,即接收文件一方的配置

controller 的写法:

@responsebody
@requestmapping(value = "/upload", method = {requestmethod.post},
        produces = {mediatype.application_json_utf8_value},
        consumes = mediatype.multipart_form_data_value)
public result<string> uploadfile(@requestpart("file")multipartfile file,
@requestparam("id")long id){
  string filename = file.getoriginalfilename();
  string extend = fileoperateutil.suffix(filename);
  fileoperateutil.copy("e:\\" + filename, file);
  return resultbuilder.success("ok");
}

@requestpart 指定文件,后面的 @requestparam 是额外参数,注意额外参数不能超过url长度限制。

三、服务消费者配置

依赖:

<dependency>
  <groupid>io.github.openfeign.form</groupid>
  <artifactid>feign-form-spring</artifactid>
  <version>3.2.2</version>
</dependency>
<dependency>
  <groupid>io.github.openfeign.form</groupid>
  <artifactid>feign-form</artifactid>
  <version>3.2.2</version>
</dependency>

文件编码配置:

import feign.codec.encoder;
import feign.form.spring.springformencoder;
import org.springframework.beans.factory.objectfactory;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.boot.autoconfigure.web.httpmessageconverters;
import org.springframework.cloud.netflix.feign.support.springencoder;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;

@configuration
public class multipartsupportconfig{

  @autowired
  private objectfactory<httpmessageconverters> messageconverters;

  @bean
  public encoder feignformencoder(){
    return new springformencoder(new springencoder(messageconverters));
  }

}

feign 接口定义:

@feignclient(name = "test-upload")
public interface uploadservice{

  @responsebody
  @requestmapping(value = "/upload", method = {requestmethod.post},
      produces = {mediatype.application_json_utf8_value},
      consumes = mediatype.multipart_form_data_value)
  result<string>uploadfile(@requestpart("file")multipartfile file,
@requestparam("id")long id);

}

与普通 feign 接口写法差不多,注意方法注解和参数与服务提供者的 controller 一样。

controller 的写法, controller 中接收前端传过来的文件信息和额外参数,然后通过 feign 接口传输到远端:

// 注入 feign 接口
@autowired
private uploadservice uploadservice;

@requestmapping(value = "/upload", method = requestmethod.post, produces = "application/json; charset=utf-8")
@responsebody
public result<string> testupload(httpservletrequest request, long id){
  result<string> result = null;
  multiparthttpservletrequest mrequest = (multiparthttpservletrequest) request;
  map<string, multipartfile> filemap = mrequest.getfilemap();
  for (multipartfile mfile : filemap.values()) {
    string filename = mfile.getoriginalfilename();
    result = uploadservice.uploadfile(mfile, id);
  }
  return result;
}

四、总结

最后梳理一下流程,服务消费者接收前端(如浏览器)传过来的文件,但是并不进行业务处理,然后通过 feign 调用接口,把文件传给服务提供者,服务提供者拿到文件后,进行相应的业务处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网