好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

spring cloud feign实现远程调用服务传输文件的方法

实践案例包括两个项目,服务提供者项目名:upload-service,调用服务项目名:upload-client,主要给出两个服务之间的调用过程,文件上传功能不提供

项目框架:spring-boot 2.0.1.release、spring-cloud finchley.release

依赖:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<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>

创建feignclient接口(用于指定远程调用的服务)

?

1

2

3

4

5

6

7

8

9

// 申明这是一个feign客户端,并且指明服务id

@feignclient (value = "com-spring-caclulate" )

public interface caclufeignclient {

 

  // 这里定义了类似于springmvc用法的方法,就可以进行restful的调用了

  @requestmapping (value = "/caclu/{num}" , method = requestmethod.get)

  public item caclulate( @pathvariable ( "num" ) integer num);

 

}

一.文件上传服务upload-service

1.控制层

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

@slf4j

@crossorigin

@restcontroller

@requestmapping ( "/ftp" )

@api (description = "文件上传控制" )

public class ftpfilecontroller {

 

  @autowired

  private ftpfileservice ftpfileservice;

 

  /**

   * ftp文件上传

   *

   * @return

   */

  @postmapping (value = "/uploadfile" , consumes = mediatype.multipart_form_data_value)

  public ftpapiresponse<ftpuploadresdto> uploadfileftp( @requestpart (value = "file" ) multipartfile file,

                @requestparam ( "logid" ) string logid) {

   ftpapiresponse<ftpuploadresdto> result = new ftpapiresponse<>();

   logutil.updatelogid(logid);

   try {

    log.info( "文件上传开始!}" );

    long starttime = system.currenttimemillis();

    ftpuploadresdto resdto = ftpfileservice.uploadfile(file);

    result.setdata(resdto);

    result.setsuccess( true );

    result.settimeinmillis(system.currenttimemillis() - starttime);

    log.info( "文件上传结束 resdto:{},耗时:{}" , resdto, (system.currenttimemillis() - starttime));

   } catch (serviceexception e){

    result.setsuccess( false );

    result.seterrorcode(errormsgenum.file_upload_exception.getcode());

    result.seterrormsg(errormsgenum.file_upload_exception.getmsg());

   } catch (exception e) {

    result.setsuccess( false );

    result.seterrorcode(errormsgenum.system_error.getcode());

    result.seterrormsg(errormsgenum.system_error.getmsg());

    log.info( "文件上传失败 exception:{}" , throwables.getstacktraceasstring(e));

   }

   return result;

  }

}

2.业务层

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

@service

@slf4j

public class ftpfileservice {

 

  @autowired

  private ftpfilemanager ftpfilemanager;

 

  /**

   * 上传文件

   *

   * @param file

   * @return

   */

  public ftpuploadresdto uploadfile(multipartfile file) {

   try {

    //判断上传文件是否为空

    if ( null == file || file.isempty() || file.getsize() == 0 ) {

     log.info( "传入的文件为空,file:{}" , file);

     throw new serviceexception(errormsgenum.empty_file);

    }

    //文件上传至ftp服务目录

    ftpfilerecorddo ftpfilerecorddo = ftpfilemanager.fileuploadtoftp(file);

    if ( null == ftpfilerecorddo) {

     log.info( "文件上传至ftp服务目录异常" );

     throw new serviceexception(errormsgenum.file_upload_to_ftp_exception);

    }

    return ftpfilemanager.addfilerecord(ftpfilerecorddo);

   } catch (exception e) {

    log.error( "业务异常,case" , e);

    throw new serviceexception(errormsgenum.system_error);

   }

  }

}

3.服务写好后,需要把远程接口暴露出去

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

@feignclient (value = "upload-service" , configuration = updownftpfacade.multipartsupportconfig. class )

public interface updownftpfacade {

 

  /**

   * ftp上传文件

   *

   * @param file 文件

   * @param logid 日志id

   * @return

   */

  @postmapping (value = "/ftp/uploadfile" ,consumes = mediatype.multipart_form_data_value)

  ftpapiresponse<ftpuploadresdto> uploadfileftp( @requestpart (value = "file" ) multipartfile file,

              @requestparam ( "logid" ) string logid);

 

  /**

   * 引用配置类multipartsupportconfig.并且实例化

   */

  @configuration

  class multipartsupportconfig {

   @bean

   public encoder feignformencoder() {

    return new springformencoder();

   }

  }

 

}

二.文件上传客户端upload-client

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

@slf4j

@component

public class filemanager {

   @autowired

   private updownftpfacade updownftpfacade;

  

   /**

   * 调用远程上传文件接口

   *

   * @param file 待上传的文件

   * @return 下载路径

   **/

  public ftpapiresponse<ftpuploadresdto> requestftpfacade(multipartfile file) {

   try {

    diskfileitem fileitem = (diskfileitem) new diskfileitemfactory().createitem( "file" ,

      mediatype.all_value, true , file.getoriginalfilename());

    inputstream input = file.getinputstream();

    outputstream os = fileitem.getoutputstream();

    ioutils.copy(input, os);

    multipartfile multi = new commonsmultipartfile(fileitem);

    ftpapiresponse<ftpuploadresdto> response = updownftpfacade.uploadfileftp(multi, logutil.getlogid());

    if ( null == response || !response.getsuccess() || null == response.getdata()) {

     throw new managerexception(errormsgenum.file_upload_failed);

    }

    return response;

   } catch (exception e) {

    throw new managerexception(errormsgenum.file_upload_failed);

   }

   }

}

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

原文链接:https://segmentfault.com/a/1190000016234692

查看更多关于spring cloud feign实现远程调用服务传输文件的方法的详细内容...

  阅读:48次