SpringBoot 文件批量壓縮下載


工具類ZipUtil

import java.io.*;
import java.net.URL;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author qhong
 * @date 2020/4/23 17:20
 **/
@Component
public class ZipUtil {

	private static HttpServletResponse response;

	@Autowired
	private HttpServletResponse response2;

	private static HttpServletRequest request;

	@Autowired
	private HttpServletRequest request2;

	@PostConstruct
	public void beforeInit() {
		request=request2;
		response=response2;
	}

	/**
	 * 批量文件壓縮下載
	 * @param urlList 需要批量下載文件的鏈接地址列表
	 * @param zipName 輸出的壓縮包名稱
	 */
	public static void downZip(List<String> urlList,String zipName){
		//響應頭的設置
		response.reset();
		response.setCharacterEncoding("utf-8");
		response.setContentType("multipart/form-data");
		String downloadName = zipName+".zip";
		//返回客戶端瀏覽器的版本號、類型
		String agent = request.getHeader("USER-AGENT");
		try {
			//針對IE或者以IE為內核的瀏覽器:
			if (agent.contains("MSIE")||agent.contains("Trident")) {
				downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
			} else {
				//非IE瀏覽器的處理:
				downloadName = new String(downloadName.getBytes("UTF-8"),"ISO-8859-1");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		response.setHeader("Content-Disposition", "attachment;fileName=\"" + downloadName + "\"");

		//設置壓縮流:直接寫入response,實現邊壓縮邊下載
		ZipOutputStream zipos = null;
		try {
			zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
			zipos.setMethod(ZipOutputStream.DEFLATED); //設置壓縮方法
		} catch (Exception e) {
			e.printStackTrace();
		}
		//循環將文件寫入壓縮流
		DataOutputStream os = null;

		for (String url : urlList) {
			try {
				URL link = new URL(url);
				String filename = FileUtil.getLinkName(url);
				//添加ZipEntry,並ZipEntry中寫入文件流
				//這里,加上i是防止要下載的文件有重名的導致下載失敗
				zipos.putNextEntry(new ZipEntry(filename));
				os = new DataOutputStream(zipos);
				InputStream is =  new BufferedInputStream(link.openStream());
				byte[] b = new byte[100];
				int length = 0;
				while((length = is.read(b))!= -1){
					os.write(b, 0, length);
				}
				is.close();
				zipos.closeEntry();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		//關閉流
		try {
			os.flush();
			os.close();
			zipos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

調用

	/**
	 * 批量下載操作
	 * @param request
	 * @return
	 */
	@Override
	public DataResponse zipDownload(@RequestBody @Validated ZipDownloadRequest request){
		if (CollectionUtils.isEmpty(request.getUrlList())) {
			throw new HuishiWebException("批量下載的url地址列表不能為空");
		}
		ZipUtil.downZip(request.getUrlList(), request.getDownloadName());
		return DataResponse.success();
	}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM