使用字节[]的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下载文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用Java从HTTPS服务器下载文件[重复]

用JAVA下载HTTP文件时遇到问题

通过使用java代码传递URL下载文件[重复]

Java之多线程断点下载的实现

java 下载pdf文件损坏

如何使用套接字下载图像[重复]