【问题标题】:Is there any way to filter request (multipart/form-data) by content-type of attached file?有没有办法按附件的内容类型过滤请求(多部分/表单数据)?
【发布时间】:2019-08-22 12:55:01
【问题描述】:
我正在开发基于 Java 的 Web 后端,它允许上传具有“multipart/form-data”内容类型和附加文件的文件。对于 API 部分,我使用 JAX-RS。我想对附件的不同内容类型使用不同的 API 方法。例如,对于“application/pdf”我想使用uploadDocument 方法,对于“application/json”我想使用uploadData 方法。
@POST
@Consumes("multipart/form-data")
void uploadDocument(@Multipart("file") File file);
@POST
@Consumes("multipart/form-data")
void uploadData(@Multipart("file") File file);
那么,我可以根据附件内容类型过滤请求吗?
附:如果你不明白,请描述什么,我会解释更多。
【问题讨论】:
标签:
java
rest
jax-rs
multipartform-data
media-type
【解决方案1】:
只有这只是实现的想法
- 你可以使用 java 8 流 API 来简单地做到这一点
@PostMapping(
value = "/uploadDocuments",
consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public void uploadDocument(
@RequestParam(required = true) MultipartFile[] file,) {
try {
Arrays.asList(files).stream()
.filter(
x ->
FilenameUtils.getExtension(x.getOriginalFilename()).equals("pdf")
|| FilenameUtils.getExtension(x.getOriginalFilename()).equals("txt"))
.forEach(
x -> {
try (BufferedReader reader =
new BufferedReader(
new InputStreamReader(
new ByteArrayInputStream(x.getBytes()),
"UTF-8"))) {
Supplier<Stream<String>> fileContentStream = reader::lines;
if (FilenameUtils.getExtension(x.getOriginalFilename()).equals("pdf")) {
String[] fileReadLines =
fileContentStream
.get()
.skip(1)// you can skip any line with this action
.map(firstLine -> firstLine.split(","))// you can use this seperate your line if you want to split
.findFirst()
.orElse(null);
}
else if (FilenameUtils.getExtension(x.getOriginalFilename()).equals("csv")) {
//Like above , I have added , you can do here for various file format
} catch (Exception ex) {
}
}