【发布时间】:2018-10-07 03:20:28
【问题描述】:
我正在尝试创建一个端点来呈现/提供 PDF 文件。 我已通过以下链接构建 API,但仍面临一些问题。
以下是我的代码:
byte[] targetArray = null;
InputStream is = null;
InputStream objectData = object.getObjectContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(objectData));
char[] charArray = new char[8 * 1024];
StringBuilder builder = new StringBuilder();
int numCharsRead;
while ((numCharsRead = reader.read(charArray, 0, charArray.length)) != -1) {
builder.append(charArray, 0, numCharsRead);
}
reader.close();
objectData.close();
object.close();
targetArray = builder.toString().getBytes();
is = new ByteArrayInputStream(targetArray);
return ResponseEntity.ok().contentLength(targetArray.length).contentType(MediaType.APPLICATION_PDF)
.cacheControl(CacheControl.noCache()).header("Content-Disposition", "attachment; filename=" + "testing.pdf")
.body(new InputStreamResource(is));
当我使用邮递员访问我的 API 时,我可以下载 PDF 文件,但问题是它完全是空白的。可能是什么问题?
【问题讨论】:
-
嗯...为什么要将PDF读入
char的数组,将其转换为String,然后从字符串中提取字节?你明白字符数据和二进制数据的区别吧? -
另外,既然您的数据已经有一个
InputStream,为什么不使用您提到的第一个链接中的InputStreamResource? -
实际上我正在尝试从远程位置获取 PDF 文件的内容,该位置正在流式传输我的 PDF 文件内容。
-
很公平,但是由于您使用
InputStream对其进行操作,因此对您来说应该是透明的。当您直接返回InputStreamResource包装objectData时会发生什么?为什么你觉得你需要所有的中间步骤? -
其实InputStream是
S3ObjectInputStream。
标签: java spring spring-boot postman