
引言
本文将要介绍 flea-jersey 提供的文件上传功能。

文件上传功能,需要引入 Flea RESTful 接口服务端和客户端依赖,详细如下所示:
1. 客户端依赖
1 2 3 4 5 6
| <dependency> <groupId>com.huazie.fleaframework</groupId> <artifactId>flea-jersey-client</artifactId> <version>2.0.0</version> </dependency>
|
2. 服务端依赖
1 2 3 4 5 6
| <dependency> <groupId>com.huazie.fleaframework</groupId> <artifactId>flea-jersey-server</artifactId> <version>2.0.0</version> </dependency>
|
3. 文件上传接入讲解
Flea RESTful接口服务端和客户端接入,本篇博文不再赘述;
可见笔者的如下的两篇文章:
3.1 服务端上传资源定义
上传资源继承 FleaJerseyPostResource,该类定义可至GitHub查看 flea-jersey-server,具体如下所示:
1 2 3 4
| @Path("upload") public class UploadResource extends FleaJerseyPostResource {
}
|
Flea Jersey POST 资源,包含 通用 POST 资源API,文件上传 POST 资源API。
1 2 3 4 5 6 7 8 9 10 11
| public abstract class FleaJerseyPostResource extends FleaJerseyFPostResource implements JerseyPostResource {
@Override public FleaJerseyResponse doPostResource(FleaJerseyRequest request) { return doResource(request); }
}
|
这里的 doPostResource
方法实现的是通用 POST 资源API,可以看到该方法里面实际调用了 FleaJerseyFPostResource
中的 doResource
方法【实际上是资源父类 Resource
中的方法】。
1 2 3 4 5 6 7 8 9 10 11
|
protected FleaJerseyResponse doResource(FleaJerseyRequest fleaJerseyRequest) { initContext(); return FleaJerseyFilterChainManager.getManager().doFilter(fleaJerseyRequest); }
|
Flea Jersey 文件 POST 资源,只包含文件 POST 资源API。
1 2 3 4 5 6 7 8 9 10 11 12
| public abstract class FleaJerseyFPostResource extends Resource implements JerseyFileUploadResource {
@POST @Path("/fileUpload") @Override public FleaJerseyResponse doFileUploadResource(FormDataMultiPart formDataMultiPart) { return doCommonFileUploadResource(formDataMultiPart); } }
|
- 首先可以看到,Flea Jersey 文件 POST 资源 实现了 Jersey 文件上传资源接口,该接口就是提供处理文件上传POST资源数据的API。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public interface JerseyFileUploadResource {
@Consumes(MediaType.MULTIPART_FORM_DATA) @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) FleaJerseyResponse doFileUploadResource(FormDataMultiPart formDataMultiPart);
}
|
- 其次也能看出,Flea Jersey 文件 POST 资源 继承了抽象资源父类
Resource
,其中 doFileUploadResource
的方法中,就是调用该抽象父类中的 doCommonFileUploadResource
方法来实现处理文件上传资源数据的逻辑;
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
|
protected FleaJerseyResponse doCommonFileUploadResource(FormDataMultiPart formDataMultiPart) {
FleaJerseyResponse fleaJerseyResponse = null;
if (ObjectUtils.isNotEmpty(formDataMultiPart)) {
FleaJerseyFileContext fleaJerseyFileContext = new FleaJerseyFileContext(); fleaJerseyFileContext.setFormDataMultiPart(formDataMultiPart); FleaJerseyManager.getManager().getContext().setFleaJerseyFileContext(fleaJerseyFileContext);
FormDataBodyPart formDataBodyPart = formDataMultiPart.getField(FleaJerseyConstants.FormDataConstants.FORM_DATA_KEY_REQUEST); String requestData = formDataBodyPart.getValueAs(String.class); fleaJerseyResponse = doResource(requestData); }
return fleaJerseyResponse; }
protected FleaJerseyResponse doResource(String requestData) { initContext(); return FleaJerseyFilterChainManager.getManager().doFilter(requestData); }
|
上传资源,配置参考如下:

关键字段如下:
字段名 |
中文描述 |
resource_code |
资源编码 |
resource_name |
资源名称 |
resource_packages |
资源包名(如果存在多个,以逗号分隔) |
3.2 服务端文件上传服务定义
文件上传服务接口类,参考实现如下:
1 2 3 4 5 6 7 8 9 10 11 12
| public interface IFleaUploadSV {
OutputFileUploadInfo fileUpload(InputFileUploadInfo input) throws Exception; }
|
文件上传服务实现类,参考实现如下【演示使用】:
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 public class FleaUploadSVImpl implements IFleaUploadSV {
private static final Logger LOGGER = LoggerFactory.getLogger(FleaUploadSVImpl.class); @Override public OutputFileUploadInfo fileUpload(InputFileUploadInfo input) throws Exception {
if (LOGGER.isDebugEnabled()) { LOGGER.debug("FleaUploadSVImpl#fileUpload(InputFileUploadInfo) Start"); }
String token = input.getToken(); if (StringUtils.isBlank(token)) { throw new ServiceException("ERROR-SERVICE0000000001", "上传鉴权令牌【token】"); }
FleaFileObject fileObject = FleaJerseyManager.getManager().getFileObject(); String fileName = fileObject.getFileName(); File uploadFile = fileObject.getFile();
String fileId = DateUtils.date2String(null, DateFormatEnum.YYYYMMDD) + RandomCode.toUUID(); IOUtils.toFile(new FileInputStream(uploadFile), "E:\\" + fileId + "_" +fileName); OutputFileUploadInfo outputFileUploadInfo = new OutputFileUploadInfo(); outputFileUploadInfo.setFileId(fileId);
if (LOGGER.isDebugEnabled()) { LOGGER.debug("FleaUploadSVImpl#fileUpload(InputFileUploadInfo) Start"); } return outputFileUploadInfo; } }
|
这里通过 FleaJerseyManager
获取 FleaFileObject
,其中包含了客户端上传的文件信息。
文件上传服务,配置参考如下:

关键字段如下:
字段名 |
中文描述 |
service_code |
服务编码 |
resource_code |
资源编码 |
service_name |
服务名称 |
service_interfaces |
服务接口类 |
service_method |
服务方法 |
service_input |
服务入参 |
service_output |
服务出参 |
3.3 客户端文件上传配置
文件上传客户端,配置参考如下:

关键字段如下:
字段名 |
中文描述 |
client_code |
客户端编码 |
resource_url |
资源地址 |
resource_code |
资源编码 |
service_code |
服务编码 |
request_mode |
请求方式 |
media_type |
媒体类型 |
client_input |
客户端业务入参 |
client_output |
客户端业务出参 |
上述配置中 请求方式 为 fpost
,这里定义为文件POST请求,可参考枚举类 RequestModeEnum
1
| FPOST("FPOST", "com.huazie.fleaframework.jersey.client.request.impl.FPostFleaRequest", "文件POST请求")
|
文件POST请求具体实现,可至 GitHub 查看 FPostFleaRequest
文件 POST 请求,对外提供了执行文件上传请求的能力。
注:服务端提供的资源入口方法需包含 POST
注解和 Path
注解【如:@Path("/fileUpload")
】,这里从 FleaJerseyFPostResource
也可以看出来。
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
| public class FPostFleaRequest extends FleaRequest {
public FPostFleaRequest() { }
public FPostFleaRequest(RequestConfig config) { super(config); }
@Override protected void init() { modeEnum = RequestModeEnum.FPOST; }
@Override protected FleaJerseyResponse request(WebTarget target, FleaJerseyRequest request) throws CommonException {
String requestData = JABXUtils.toXml(request, false); FleaJerseyManager.getManager().addFormDataBodyPart(requestData, FleaJerseyConstants.FormDataConstants.FORM_DATA_KEY_REQUEST);
Entity<FormDataMultiPart> entity = Entity.entity(FleaJerseyManager.getManager().getFileContext().getFormDataMultiPart(), toMediaType());
FleaJerseyResponse response = target .path(FleaJerseyConstants.FileResourceConstants.FILE_UPLOAD_PATH) .request() .post(entity, FleaJerseyResponse.class);
return response; } }
|
3.4 客户端文件上传调用
文件上传自测类,可至GitHub查看 JerseyTest
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Test public void testUploadFile() { try { String clientCode = "FLEA_CLIENT_FILE_UPLOAD";
InputFileUploadInfo input = new InputFileUploadInfo(); input.setToken(RandomCode.toUUID()); File file = new File("E:\\IMG.jpg"); FleaJerseyManager.getManager().addFileDataBodyPart(file);
FleaJerseyClient client = applicationContext.getBean(FleaJerseyClient.class); Response<OutputFileUploadInfo> response = client.invoke(clientCode, input, OutputFileUploadInfo.class);
LOGGER.debug("result = {}", response); } catch (Exception e) { LOGGER.debug("Exception = ", e); } }
|
有关 FleaJerseyClient
的使用,可以查看笔者的《Flea RESTful接口客户端接入》
总结
至此,文件上传已接入完毕,下篇博文将会讲解文件下载接入。