Spring下载二进制文件

时间:2018-04-12 04:15:50

标签: java spring spring-boot

我正在尝试编写一个控制器来下载二进制文件。

源代码如下:

  public @ResponseBody byte[] getOpenedEventsInPdf(HttpServletResponse response)
        throws IOException, URISyntaxException {

    ClassPathResource pdfFile = new ClassPathResource(SRC_FILE);
    HttpHeaders headers = new HttpHeaders();
    response.addHeader("Content-Type", "application/pdf");
    response.addHeader("Access-Control-Allow-Origin", "*");
    response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT");
    response.addHeader("Access-Control-Allow-Headers", "Content-Type");
    response.addHeader("Content-Disposition", "filename=" + FILE_NAME);
    response.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    response.addHeader("Pragma", "no-cache");
    response.addHeader("Expires", "0");

    headers.setContentLength(pdfFile.contentLength());

    byte[] toRet = toByteArray(new DataInputStream(
            new FileInputStream(new File(this.getClass().getClassLoader().getResource(SRC_FILE).toURI()))));
    byte[] bte = { (byte) 128, 65, (byte) 129, 65, (byte) 130 };
    System.out.println(toRet[0] & 0xFF);
    System.out.println(toRet[0]);
    System.out.println(toRet.length);
//        return toRet ;
    return bte;
}

但问题是如果我返回bte,我正好得到5个字节 如果我返回到Ret,我得到509个字节。但源FILE_NAME包含256个字节,从0到255开始。

我猜测以下行有事可做。

byte[] toRet = toByteArray(new DataInputStream(
        new FileInputStream(new File(this.getClass().getClassLoader().getResource(SRC_FILE).toURI()))));

因为127以上的值被修改了。我错过了什么?

- 来自评论的请求代码 -

private byte[] listToByteArray(List<byte[]> input) {
    if (input == null || input.size() == 0) {
        return new byte[] {};
    }
    byte[] toRet = {};
    for (byte[] b : input) {
        toRet = ArrayUtils.addAll(toRet, b);
    }
    return toRet;
}

private byte[] toByteArray(InputStream is) throws IOException {
    List<byte[]> byteArrayList = new ArrayList<byte[]>();
    while (true) {
        byte[] buff = new byte[READ_BYTE_LENGTH];
        int r = is.read(buff);
        if (r == -1) {
            break;
        } else if (r == READ_BYTE_LENGTH) {
            byteArrayList.add(buff);
        } else {
            byteArrayList.add(Arrays.copyOf(buff, r));
        }
    }
    return listToByteArray(byteArrayList);
}

如果你徘徊为什么我会在番石榴或阿帕奇常见的lang提供所有可用时这种疯狂?这是因为我对这个很疯狂

2 个答案:

答案 0 :(得分:0)

我认为你对字节的读取比它需要的更复杂,并且可能是这个问题的原因。如果您正在使用java 9,那么您应该

private byte[] toByteArray(InputStream is) throws IOException {
    return is.readAllBytes();
}

如果您不这样做,请使用以下内容:

private byte[] toByteArray(InputStream is) throws IOException {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    byte[] data = new byte[16384];

    while ((int nRead = is.read(data, 0, data.length)) != -1) {
       buffer.write(data, 0, nRead);
    }

    return buffer.toByteArray();
}

答案 1 :(得分:0)

我意识到,我的InputStream或读取机制与数据损坏无关。 Maven正在将PDF文件和我的测试二进制文件修改为UTF-8。我正在寻找那个解决方案。感谢所有对此问题感兴趣的人。