servlet实现多文件打包下载

当用户一次下载多个文件时。普通情况是,每下载一个文件,均要弹出一个下载的对话框。这给用户造成了非常大不便。

比較理想的情况是,用户选择多个文件后。server后端直接将多个文件打包为zip。以下贴出实现代码。

前端Javascript代码(使用Javascript创建表单。通过提交表单的方式訪问后端的MultiDownload):

var tmpForm = document.createElement("form");
tmpForm.id = "form1" ;
tmpForm.name = "form1" ;
document.body.appendChild(tmpForm);

var tmpInput = document.createElement("input");
// 设置input对应參数
tmpInput.type = "text";
tmpInput.name = "fileUrls" ;
tmpInput.value = downloadUrls;
// 将该输入框插入到 tmpform 中
tmpForm.appendChild(tmpInput);

tmpForm.action= "servlet/MultiDownload" ;
tmpForm.method= "get";
tmpForm.submit();
//从html从移除该form
document.body.removeChild(tmpForm);

后端MultiDownload代码:

public class MultiDownload extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public MultiDownload() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String strArray = null;
		strArray = request.getParameter("fileUrls");
		//传递到servlet时,默认将编码转换为ISO-8859-1,将其又一次转码为GBK
		strArray=new String(strArray.getBytes("ISO-8859-1"), "GBK");
		String[] filePathArray = strArray.split(",");
		String zipFileName = "product.zip";
		response.setContentType("application/x-msdownload" ); // 通知客户文件的MIME类型:
		response.setHeader("Content-disposition" , "attachment;filename=" + zipFileName);
		//要下载的文件文件夹
		ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
		for (String filePath : filePathArray) {
			File file = new File(filePath);
			doZip(file, zos);
		}
		zos.close();
	}
	/**
	 *  打包为 zip 文件
	 * @param file 待打包的文件
	 * @param zos zip zip输出流
	 * @throws IOException
	 */
	private void doZip(File file, ZipOutputStream zos)
			throws IOException {
		if(file.exists()) {
			if (file.isFile()) {
				//假设是文件,写入到 zip 流中
				zos.putNextEntry(new ZipEntry(file.getName()));
				FileInputStream fis = new FileInputStream(file);
				byte[] buffer = new byte[1024];
				int r = 0;
				while ((r = fis.read(buffer)) != -1) {
					zos.write(buffer, 0, r);
				}
				zos.flush();
				fis.close();
			} else {
				//假设是文件夹。

递归查找里面的文件
				String dirName = file.getName() + "/";
				zos.putNextEntry(new ZipEntry(dirName));
				File[] subs = file.listFiles();
				for (File f : subs) {
					makeZip(f, dirName, zos);
				}
			}
		}
	}
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}
时间: 2024-10-21 03:01:33

servlet实现多文件打包下载的相关文章

多文件打包下载以及单文件下载

今天项目中需要多文件打包下载和单文件下载的功能,以下做一些总结. 原代码: 1 package com.hlbj.utils; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.util.ArrayList; 9

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 && Linux下的ZipArchive配置开启压缩

PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有疑问欢迎交流.这里整理一下常用的示例供参考. 一.解压缩zip文件 ? 1 2 3 4 5 6 7 8 9 10 11 $zip = new ZipArchive;//新建一个ZipArchive的对象 /* 通过ZipArchive的对象处理zip文件 $zip->open这个方法的参数表示处理的

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载

PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 http://my.oschina.net/junn/blog/104464 PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有疑问欢迎交流.这里整理一下常用的示例供参考. 一.解压缩zip文件 ? 1 2 3 4 5 6 7 8 9 10 11 $zip = new ZipAr

java 实现多文件打包下载

jsp页面js代码: function downloadAttached(){ var id = []; id.push(infoid); var options = {}; options.action = "${pageContext.request.contextPath}/DocumentController/downloadattached"; options.argname1="id"; options.argvalue1=id.join(','); f

Java批量文件打包下载

经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名,通过使用ant.jar中的org.apache.tools.zip里的ZipOutPutStream为实现编码的设置. 代码如下: ant包引用 [html] view plain copy print? <span style="font-size:14px">Xml代码 &

de4dot3.14更新文件打包下载

刚发现de4dot更新了,虽然只是10月份的文件更新,并未发布新的release,但好多人还不会编译... 关于de4dot有何功能就不再讲了. 本文主要提供编译通过后的打包文件下载. 首先下载de4dot源代码(点击这里),同时还需要下载作者的另一个library(dnlib). 解压 dnlib 后将 dnlib-master 文件夹中文件复制到 \de4dot-master\dnlib 中用 Visual Studio (最低版本2010)打开即可. 本文地址:http://www.cnb

PHP扩展类ZipArchive实现压缩Zip文件和文件打包下载

1 <?php 2 /** 3 * 关于文件压缩和下载的类 4 * @author tycell 5 * @version 1.0 6 */ 7 class zip_down{ 8 9 protected $file_path; 10 /** 11 * 构造函数 12 * @param [string] $path [传入文件目录] 13 */ 14 public function __construct($path){ 15 $this->file_path=$path; //要打包的根目录

php ZipArchive 多文件打包下载

public function downLoad($dataUrl,$saveName) { $datalist = [ ROOT_PATH.'/public/introduce/110.docx', ROOT_PATH.'/public/upfile/110.zip' ]; // print_r($datalist);die; $filename = ROOT_PATH.'\public\/'.$saveName.'.zip'; if(file_exists($filename)){ unli

【Linux命令】--(4)文件打包上传和下载

文件打包上传和下载 +++++++++++++++++++++++++++++++用SecureCRT来上传和下载文件tar命令gzip命令+++++++++++++++++++++++++++++++先把计划放着,待老夫国庆把它学完!