实践案例包括两个项目,服务提供者项目名: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>
|
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