Java Web 学习笔记之十三:RestEasy接口处理浏览器表单上传的文件

前提

  • 后端服务使用Jboss restEasy搭建rest服务
  • 业务需求需要使用文件上传功能
  • 文件上传格式为浏览器表单上传文件

实现步骤

1.添加依赖

reasteasy解析表单文件需要添加扩展依赖,以maven项目为例,依赖如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependencies>
<!--resteasy 基础依赖-->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.1.0.Final</version>
</dependency>

<!--reasteasy multipart 表单扩展依赖-->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
<version>3.0.0.Final</version>
</dependency>

</dependencies>

2.编写接口

resteasy解析表单数据需要使用org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput接口,下面代码示例说明接口编写方式

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
* 获取解析上传的文件
*
* @param multipartFormDataInput
* @return
* @throws Exception
*/
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)//接收数据类型为MULTIPART_FORM_DATA
@Produces(MediaType.APPLICATION_JSON)
public Boolean uploadStockAnalyseScriptFile(MultipartFormDataInput multipartFormDataInput)
throws Exception {
//获取表单中的数据map
Map<String, List<InputPart>> dataMaps = multipartFormDataInput.getFormDataMap();

//根据表单元素名称获取表单元素(需要同前端同学沟通好表单元素的name)
List<InputPart> fileParts = dataMaps.get("file");//表单元素-文件

//解析获取表单文件的输入流
InputStream inputStream;
try {
if (fileParts == null || fileParts.isEmpty())
throw new Exception("请求参数为空!");

InputPart filePart = fileParts.get(0);
inputStream = filePart.getBody(InputStream.class, null);
} catch (Exception e) {
throw new Exception(e.getMessage());
}

//保存文件至本地
String filePathName = "C:\\Users\\Johnson\\Desktop\\newFile.txt";
File target = new File(filePathName);
FileOutputStream fos = null;
try {
if (!target.getParentFile().exists())
target.getParentFile().mkdirs();
fos = new FileOutputStream(target);
byte[] b = new byte[1024];
int readLength;
while ((readLength = inputStream.read(b)) != -1) {
fos.write(b, 0, readLength);
}
} catch (Exception e) {
throw new AssistanceException(e.getMessage());
} finally {
if (inputStream != null)
inputStream.close();
if (fos != null)
fos.close();
}

return true;
}

另外,解析表单文件元素文件名,解析表单元素获取字串的方式如下

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
42
43
44
import org.jboss.resteasy.plugins.providers.multipart.InputPart;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;


...........................




/**
* 从表单文件元素中提取文件名
*
* @param filePart
* @return
* @throws Exception
*/
public static String getFileNameByFileInputPart(InputPart filePart) throws Exception {
String[] contentDispositionHeader = filePart.getHeaders().getFirst("Content-Disposition").split(";");
for (String fileName : contentDispositionHeader) {
if ((fileName.trim().startsWith("filename"))) {
String[] tmp = fileName.split("=");
String fileNameStr = tmp[1].trim().replaceAll("\"", "");
return fileNameStr;
}
}
return null;
}

/**
* 从表单元素中获取字串文本并以UTF-8编码
*
* @param inputPart
* @return
* @throws Exception
*/
public static String getInputPartAsString(InputPart inputPart) throws Exception {
if (inputPart == null)
return null;
String nameString = inputPart.getBodyAsString();
if (nameString == null || nameString.isEmpty())
return null;
return URLDecoder.decode(nameString, StandardCharsets.UTF_8.name());
}

这两个方法可以当做工具方法来使用