收到的文件比发送的文件大

时间:2015-05-23 19:32:01

标签: java file spring-restcontroller

这是发送文件的代码:

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”&lt; - 像这样。

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

我也试过setHtentLength我正在发送的标题,但它会产生相同的结果 - 接收文件的内容错误,即使大小正确。

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

1 个答案:

答案 0 :(得分:5)

目前尚不清楚究竟发送文件的确切内容,但它是以base64形式传输的 - 这就是它原来大小的4/3的原因。

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

这应该可以给你一个关于如何使用base64发送文件而不用的提示 - 可能在你正在使用的框架中默认为base64,你可以覆盖它来发送数据只是二进制。