如何使用 spring rest 服务/spring boot 下载 Excel

Posted

技术标签:

【中文标题】如何使用 spring rest 服务/spring boot 下载 Excel【英文标题】:How to download Excel using spring rest service / spring boot 【发布时间】:2020-01-02 19:39:21 【问题描述】:

使用 spring boot 下载时 Excel 下载不工作 - 问题可能是设置 CONTENT TYPE ,我怀疑! 我尝试设置不同的 CONTENT TYPE 标题,但不能使用 EXCEL。

我的要求:下面的代码应该对所有类型的文件都是通用的。

@GetMapping(value = "/files/id", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public ResponseEntity<ByteArrayResource> downloadAnyFile()


byte[] byteArray;  // data comes from external service call in byte[]

ByteArrayResource resource = new ByteArrayResource(byteArray, docName);
                return ResponseEntity.ok()
                        .header(HttpHeaders.CONTENT_DISPOSITION, ATTACHMENT + docName)
                        .contentType(MediaType.APPLICATION_OCTET_STREAM)
                        .contentLength(resource.contentLength())
                        .body(resource);

// Also tried this below content-type but not working
String mimeType = ServletContext.getMimeType(fileName);
 .contentType(MediaType.parseMediaType(mimeType))


I am seeing warning of file corrupted while opening , The downloaded excel 文件不应损坏。它应该像上传前一样打开。

【问题讨论】:

***.com/questions/42767079/…这个有用 @Babasheb: 谢谢你的回复,# 我已经试过了,但是不行。 # 你已经开始工作了吗?我也面临同样的问题。 【参考方案1】:

请尝试以下代码。

@GetMapping(value = "/files/id", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
  public ResponseEntity<?> downloadAnyFile() 
    String dirPath = "your-location-path";
    byte[] byteArray;  // data comes from external service call in byte[]
    try 
       String fileName = "your-custom-file-name";
      byteArray = Files.readAllBytes(Paths.get(dirPath + fileName));
     catch (IOException e) 
      e.printStackTrace();
    
    return ResponseEntity.ok()
        .contentType(MediaType.APPLICATION_OCTET_STREAM)
        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
        .body(byteArray);
  

您可以根据需要使用@GetMapping@PostMapping

【讨论】:

我已经意识到问题是,当我上传/发送 excel 文件的文件内容时(其余文件,例如:pdf、csv、.docx .zip 没有问题)作为 byte[] byteArr = MultipartFile.getBytes() 到文件存储 REST 服务输入,数据正在损坏。我不明白为什么会这样!而且我的下载功能没有任何问题。我意识到了。

以上是关于如何使用 spring rest 服务/spring boot 下载 Excel的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Data-Rest 验证器

Spring Cloud Ribbon

RestTemplate使用

如何在通过驼峰调用Restful serice时添加jks文件

如何使用 spring3 保护服务 REST?

如何使用 Spring Security 和 Angularjs 保护 Spring Rest 服务?