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



  • 相关阅读:
    从图片中提取html格式的布局
    javascript语法
    2015 9月2日 工作计划与执行
    2015 9月1日 工作计划与执行
    支付模块结构设计
    ubuntu下的pycharm4中文路径乱码
    2015 8月31 工作计划与执行
    25个git进阶技巧 2015-05-12 16:04 34人阅读 评论(0) 收藏
    Model/View框架总体架构 分类: QT学习实践 2015-05-11 22:05 34人阅读 评论(0) 收藏
    用Dom处理XML文件 分类: QT学习实践 2015-05-11 21:16 30人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6715899.html
Copyright © 2020-2023  润新知