記一次批量下載文件zip輸出

http連接無法通過後端多次遍歷的方式一個一個文件的下載,一次下載完成後連接就斷開了,所以必須把多個文件壓縮後輸出





  @ApiOperation(value = "批量文件下載", notes = "批量文件下載")
  @RequestMapping(value = "/bigdossierDownload", method = RequestMethod.POST)
  public APIResult bigdossierDownload(@RequestBody @Valid BigDossierDownloadRequestDTO bigDossierDownloadRequestDTO,
      HttpServletResponse response) throws Exception {
    log.info(bigDossierDownloadRequestDTO.getCaseId() + "***" + bigDossierDownloadRequestDTO.getFileId().size());
    List<String> list = bigDossierDownloadRequestDTO.getFileId();
    //存放--服務器上zip文件的目錄
    String directory = "/data/storage" + File.separator + "temp";
//    String directory = "D:\\data" + File.separator + "temp"; //本地測試
    log.info(" server zip directory:" + directory);
    File directoryFile = new File(directory);
    if (!directoryFile.isDirectory() && !directoryFile.exists()) {
      directoryFile.mkdirs();
    }
    //設置最終輸出zip文件的目錄+文件名
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    String zipFileName = formatter.format(new Date()) + ".zip";
    String strZipPath = directory + File.separator + zipFileName;
    ZipOutputStream zipStream = null;
    FileInputStream zipSource = null;
    BufferedInputStream bufferStream = null;
    File zipFile = new File(strZipPath);
    try {
      //構造最終壓縮包的輸出流
      zipStream = new ZipOutputStream(new FileOutputStream(zipFile));
      for (int i = 0; i < list.size(); i++) {
        //解碼獲取真實路徑與文件名
        // 調文件服務器
        DubboResult<FileInfoResponseDTO> fileInfo = fileStorageApi.getFileInfo(list.get(i));
        log.info("FileName():" + fileInfo.getData().getFileName() + "filepath:" + fileInfo.getData().getFilePath());
        String realFileName = fileInfo.getData().getFileName();
        String realFilePath = fileInfo.getData().getFilePath();
//        String realFilePath = "D:\\data" + File.separator +  list.get(i); //本地測試
        File file = new File(realFilePath);
        if (file.exists()) {
          zipSource = new FileInputStream(file); //將需要壓縮的文件格式化爲輸入流
          /**
           * 壓縮條目不是具體獨立的文件,而是壓縮包文件列表中的列表項,稱爲條目,就像索引一樣這裏的name就是文件名,
           * 文件名和之前的重複就會導致文件被覆蓋
           */
          ZipEntry zipEntry = new ZipEntry(realFileName); //在壓縮目錄中文件的名字
          zipStream.putNextEntry(zipEntry); //定位該壓縮條目位置,開始寫入文件到壓縮包中
          bufferStream = new BufferedInputStream(zipSource, 1024 * 10);
          int read = 0;
          byte[] buf = new byte[1024 * 10];
          while ((read = bufferStream.read(buf, 0, 1024 * 10)) != -1) {
            zipStream.write(buf, 0, read);
          }
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      //關閉流
      if (null != bufferStream) {
        bufferStream.close();
      }
      if (null != zipStream) {
        zipStream.flush();
        zipStream.close();
      }
      if (null != zipSource) {
        zipSource.close();
      }
    }
    log.info("zipFileName:" + zipFileName + "  strZipPath:" + strZipPath);
    if (zipFile.exists()) {
      downFile(response, zipFileName, strZipPath);
      zipFile.delete();
    }
    log.info("big upload end");
    return  null;
  }

請求參數:

@Data
@ApiModel(description = "批量下載文件請求參數")
public class BigDossierDownloadRequestDTO implements Serializable {

  private static final long serialVersionUID = 1L;
  @ApiModelProperty(notes = "recordId", required = true, example = "666")
  @NotNull(message = "記錄ID參數爲空")
  private Long recordId;
  @ApiModelProperty(notes = "文件IDs", required = false, example = "['53348bbf7f3f450aad61d3dc20544f10','53348bbf7f3f450aad61d3dc20544f10']")
  private List<String> fileId;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章