0

这是发送文件的代码:

byte[] data = FileUtils.readFileToByteArray(new File("my_file.docx"));

System.out.println(data.length); // prints 6408

ResponseEntity<byte[]> responseEntity = makeResponse(data, HttpStatus.OK, DOCX);

return responseEntity;


private <T> ResponseEntity<T> makeResponse(T responseParameter, HttpStatus httpStatus,
                                           DocumentFormat documentFormat) {
    HttpHeaders headers = new HttpHeaders();

    String filename;

    switch (documentFormat) {
        case PDF:
            headers.setContentType(MediaType.parseMediaType("application/pdf"));
            filename = "output.pdf";
            break;
        case DOCX:
            headers.setContentType(MediaType.parseMediaType("application/docx"));
            filename = "output.docx";
            break;
        default:
            throw new IllegalArgumentException(documentFormat.name() + "is not supported");
    }

    headers.setContentDispositionFormData(filename, filename);
    return new ResponseEntity<>(responseParameter, headers, httpStatus);
}

接收到的文件大小为 8546 字节。发送的文件大小为 6408 字节。即使编码有些错误,接收到的文件也应该是相同的大小,对吧?接收到的文件的内部看起来像两页随机字符,“UEsDBBQACAgIANqVt0YAAAAAAAAAAAAA”<-类似这样。

在发送响应之前,我尝试将从 my_file.docx 读取的字节数组写入本地磁盘上的文件,并且它工作正常。

我还尝试设置我发送的标头的内容长度,但它产生相同的结果 - 接收文件的错误内容,即使大小是正确的。

知道额外的 2Kb 来自哪里吗?我该如何解决这个错误?

4

1 回答 1

5

目前尚不清楚实际发送文件的确切内容,但它以 base64 格式传输 - 这就是为什么它是原始文件大小的 4/3。

我很确定如果您通过 base64 解码器运行接收到的文件,您将获得原始数据。看看标题,我怀疑你会发现其中提到的 base64。

这可能会给你一个关于如何在使用 base64 的情况下发送文件的提示 - 大概在你使用的框架中默认为 base64,你可以覆盖它以将数据作为二进制发送。

于 2015-05-23T19:36:56.973 回答