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;
}