如何在Java中读取多部分文件输入流的内容



我有一个Thymelaf html表单,它接受上传的文件作为输入,然后向Java控制器发出对多部分文件的post请求。然后,我将该文件转换为输入流。虽然我可以读取文件的大小和输入类型,但无法成功打印出内容。

例如,对于.doc文件,如果我尝试我找到的打印文件内容的方法,它只打印一系列数字。我假设这是一种编码。是否存在打印上传的.doc文件内容的方法?

我目前用来尝试打印文件内容的控制器操作是:

@PostMapping("/file-upload")
public String uploadFile(@RequestParam("fileUpload") MultipartFile fileUpload, Model model) throws IOException {
InputStream fis = fileUpload.getInputStream();
for (int i = 0; i < fis.available(); i++) {
System.out.println("" + fis.read());
}
return "home";
}

我用来提交文件的表格是:

<form th:action="@{/file-upload}" enctype="multipart/form-data" method="POST">
<div class="container">
<div class="row" style="margin: 1em;">
<div class="col-sm-2">
<label for="fileUpload">Upload a New File:</label>
</div>
<div class="col-sm-6">
<input type="file" class="form-control-file" id="fileUpload" name="fileUpload">
</div>
<div class="col-sm-4">
<button type="submit" class="btn btn-dark">Upload</button>
</div>
</div>
</div>
</form>

不要使用InputStream.available((。来自文档:

使用此方法的返回值来分配用于保存此流中所有数据的缓冲区是不正确的。

只有从read((中获得值-1表示InputStream的结束。

例如,对于.doc文件,如果我尝试我找到的打印文件内容的方法,它只打印一系列数字。我假设这是一种编码。

您的假设不正确。.doc文件是复杂的二进制格式,而不仅仅是文本编码。(尝试在记事本中打开.doc文件。(

你得到数字是因为你在打印数字。read((返回一个int。"" + fis.read()将每个返回的int转换为String。

如果你真的想打印文件的内容,直接写字节:

int b;
while ((b = fis.read()) >= 0) {
System.out.write(b);
}

如果您使用的是Java 9或更高版本,您可以使用:

fis.transferTo(System.out);

但是,这两个选项都不会以可读的形式显示Word文档的内容。您需要一个可以从Word文件中读取文本内容的库,如Apache POI。(还有其他可用的库;您可能需要搜索它们。(

最新更新