使用字节[]的Java下载文件

使用字节[]的Java下载文件,java,servlets,outputstream,Java,Servlets,Outputstream,我有一个web服务方法,它返回一个字节[],所以我这样做是为了强制下载返回的文件 final byte[]content=axisService.getWebFileContent(pieceJoint.getVlidnlfy()); 如果(内容!=null){ 最终映射文件=新HashMap(2); lrFile.put(“内容”,CONTENT); lrFile.put(“MIMETYPE”、“应用程序/八位字节流”); response.reset(); resetBuffer(); re

我有一个web服务方法,它返回一个
字节[]
,所以我这样做是为了强制下载返回的文件

final byte[]content=axisService.getWebFileContent(pieceJoint.getVlidnlfy());
如果(内容!=null){
最终映射文件=新HashMap(2);
lrFile.put(“内容”,CONTENT);
lrFile.put(“MIMETYPE”、“应用程序/八位字节流”);
response.reset();
resetBuffer();
response.setContentType(“应用程序/强制下载”);
setHeader(“内容传输编码”、“二进制”);
response.setHeader(“内容处置”,
“附件;文件名=\”“+PieceJoint.getLbnompcj()+”\”;//文件名);
response.getOutputStream().write((字节[])lrFile.get(“内容”);
response.setContentLength(((byte[])lrFile.get(“CONTENT”).length);
response.getOutputStream().close();
response.flushBuffer();
}

但它不起作用,我在控制台上也没有看到任何错误。是否需要向我的响应对象添加其他配置?

在写入输出后,您正在设置内容长度

  response.getOutputStream().write((byte[]) lrFile.get("CONTENT"));
  response.setContentLength(((byte[]) lrFile.get("CONTENT")).length);


由于内容配置中没有
filename*=
,因此文件名不应包含特殊字符

您仍然不应该写入输出(无论是
getOutputSteam()
还是
getOutputWriter()

目前我无法测试代码的内容配置。因此,请阅读参考资料。 可能是这样的:

   response.setHeader("Content-Disposition", "attachment; filename*=UTF-8\'\'" + filename);

reset
不应该执行,
resetBuffer
更像是一种黑客行为,如果已经编写了一些内容,但仍然驻留在缓冲区中。

这可能对您有用,因为它是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());
}
byte[]fileContent=s3Client.getObject(imagesBucketName、documentsFolderName、metadata.getFileName());
资源=新的InputStreamResource(新的ByteArrayInputStream(fileContent));
FileResponse FileResponse=新的FileResponse();
fileResponse.setInputStreamResource(资源);
setMimeType(metadata.getContentType());
fileResponse.setFileSize(metadata.getFileSize());
@GetMapping(“/logo/{spaceId}”)
public ResponseEntity getCompanyLogo(@PathVariable(“spaceId”)整数spaceId)
引发FileDownloadException,InvalidInputException{
FileResponse FileResponse=companySpaceService.downloadCompanyLogo();
return ResponseEntity.ok().contentLength(fileResponse.getFileSize())
.contentType(MediaType.parseMediaType(fileResponse.getMimeType()))
.body(fileResponse.getInputStreamResource());
}

但它不工作,而且我的控制台中没有任何错误-错误是什么?代码应该如何工作?您可以编辑您的问题并添加更多信息吗?您好,此代码用于强制将文件加载到我的浏览器中,但执行此代码后不会发生任何事情,以排除最常见的初学者错误:您是否使用ajax访问“web服务”?是的,我使用ajax调用我的methodOK,您的servlet没有问题。问题在于您使用的是ajax,而不是一个简单的
窗口。location=servletUrl
。下次对servlet进行单元测试时(不使用ajax)。您应该注意到,您的代码实际上运行得很好。有关某些解决方案/备选方案,请参阅上面链接的dupe。即使执行此操作,也会出现相同的问题您的“lrFile.get(“CONTENT”).length”返回值是否大于0?我通过创建表单并使用提交操作来执行请求,从而解决了此问题
   response.setHeader("Content-Disposition", "attachment; filename*=UTF-8\'\'" + filename);
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());
}