使用字节[]的Java下载文件[重复]
Posted
技术标签:
【中文标题】使用字节[]的Java下载文件[重复]【英文标题】:Java download file using a byte[] [duplicate] 【发布时间】:2020-04-02 15:58:20 【问题描述】:我有一个返回byte[]
的网络服务方法,所以我这样做是为了强制下载返回的文件
final byte[] content = axisService.getWebFileContent(pieceJointe.getVlidnlfy());
if (content != null)
final Map<String, Object> lrFile = new HashMap<>(2);
lrFile.put("CONTENT", content);
lrFile.put("MIMETYPE", "application/octet-stream");
response.reset();
response.resetBuffer();
response.setContentType("application/force-download");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-Disposition",
"attachment; filename=\"" + pieceJointe.getLbnompcj() + "\"");// fileName);
response.getOutputStream().write((byte[]) lrFile.get("CONTENT"));
response.setContentLength(((byte[]) lrFile.get("CONTENT")).length);
response.getOutputStream().close();
response.flushBuffer();
但它不起作用,我在控制台上看不到任何错误。我需要向我的响应对象添加额外的配置吗?
【问题讨论】:
但它不起作用,我的控制台中没有任何错误 — 错误是什么,代码应该如何工作?您能否编辑您的问题并添加更多信息? 您好,此代码用于强制将文件下载到我的浏览器中,但执行此代码后没有任何反应 排除初学者最常犯的错误:你是用ajax点击“web服务”吗? 是的,我正在使用 ajax 来调用我的方法 好的,你的 servlet 没有问题。问题是因为您使用的是 ajax 而不是简单的window.location=servletUrl
。下次对您的 servlet 进行单元测试(不使用 ajax)。您应该已经注意到您的代码实际上工作得很好。有关一些解决方案/替代方案,请参阅上面链接的副本。
【参考方案1】:
您在编写输出后设置内容长度。
response.getOutputStream().write((byte[]) lrFile.get("CONTENT"));
response.setContentLength(((byte[]) lrFile.get("CONTENT")).length);
到
response.setContentLength((long) lrFile.get("CONTENT").length);
response.getOutputStream().write((byte[]) lrFile.get("CONTENT"));
【讨论】:
即使在这样做之后也会出现同样的问题 您的“lrFile.get("CONTENT").length" 是否返回 >0 ?【参考方案2】:由于你在内容配置中没有filename*=
,所以文件名不能包含特殊字符。
您仍然不应该写入输出(getOutputSteam()
或 getOutputWriter()
)。
response.setContentType("application/force-download");
response.setContentLength(content.length);
//response.setHeader("Content-Transfer-Encoding", "binary");
String filename = URLEncoder.encode(pieceJointe.getLbnompcj(), "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
response.getOutputStream().write(content);
response.getOutputStream().close();
目前我无法测试内容处置的代码。所以请阅读参考资料。 可能是这样的:
response.setHeader("Content-Disposition", "attachment; filename*=UTF-8\'\'" + filename);
reset
不应该这样做,resetBuffer
更像是一个 hack,应该已经写了一些东西但仍然驻留在缓冲区中。
【讨论】:
我通过创建表单并使用提交操作来执行请求解决了这个问题【参考方案3】:这可能对你有用 s3Client getObject as byte[] fileContent.
byte[] fileContent = s3Client.getObject(imagesBucketName, documentsFolderName, metadata.getFileName());
resource = new InputStreamResource(new ByteArrayInputStream(fileContent));
FileResponse fileResponse = new FileResponse();
fileResponse.setInputStreamResource(resource);
fileResponse.setMimeType(metadata.getContentType());
fileResponse.setFileSize(metadata.getFileSize());
@GetMapping("/logo/spaceId")
public ResponseEntity<InputStreamResource> getCompanyLogo(@PathVariable("spaceId") Integer spaceId)
throws FileDownloadException, InvalidInputException
FileResponse fileResponse = companySpaceService.downloadCompanyLogo();
return ResponseEntity.ok().contentLength(fileResponse.getFileSize())
.contentType(MediaType.parseMediaType(fileResponse.getMimeType()))
.body(fileResponse.getInputStreamResource());
【讨论】:
以上是关于使用字节[]的Java下载文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章