我正在尝试编写一个控制器来下载二进制文件。
源代码如下:
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提供所有可用时这种疯狂?这是因为我对这个很疯狂
答案 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。我正在寻找那个解决方案。感谢所有对此问题感兴趣的人。