【问题标题】:How to read contents of a multipart file inputstream in Java如何在 Java 中读取多部分文件输入流的内容
【发布时间】:2020-07-27 00:19:35
【问题描述】:

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

例如,对于一个 .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>

【问题讨论】:

    标签: java spring inputstream multipartform-data


    【解决方案1】:

    不要使用 InputStream.available()。来自the documentation

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

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

    例如,对于一个 .doc 文件,如果我尝试使用我发现的打印文件内容的方法,它只会打印一系列数字。我假设是一种编码。

    你的假设是错误的。 .doc 文件是复杂的二进制格式,而不仅仅是文本编码。 (尝试在记事本中打开一个 .doc 文件。)

    你得到数字是因为你在打印数字。 InputStream.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。 (还有其他可用的库;您可能需要搜索它们。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-25
      • 2013-07-16
      • 2011-10-28
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      相关资源
      最近更新 更多