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
} }
servlet实现多文件打包下载的更多相关文章
- PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载 && Linux下的ZipArchive配置开启压缩 &&搞个鸡巴毛,写少了个‘/’号,浪费了一天
PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启,具体开启方法就不说了,不同的平台开启PHP扩增的方法网上都有,如有 ...
- PHP 多文件打包下载 zip
<?php $zipname = './photo.zip'; //服务器根目录下有文件夹public,其中包含三个文件img1.jpg, img2.jpg, img3.jpg,将这三个文件打包 ...
- flask BytesIO() 多个文件打包下载 zipfile
使用zipfile模块可以将多个文件打包成zip文件进行下载,但是常规的操作方式会在服务器磁盘上生成一个zip文件占用磁盘空间. 后引入BytesIO将文件写入到内存中然后下载: def dl_pla ...
- java 实现多文件打包下载
jsp页面js代码: function downloadAttached(){ var id = []; id.push(infoid); var options = {}; options.acti ...
- Java批量文件打包下载
经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名, ...
- de4dot3.14更新文件打包下载
刚发现de4dot更新了,虽然只是10月份的文件更新,并未发布新的release,但好多人还不会编译... 关于de4dot有何功能就不再讲了. 本文主要提供编译通过后的打包文件下载. 首先下载de4 ...
- Java批量文件打包下载zip
网上看了很多,本文使用ant.jar中的org.apache.tools.zip,页面用js表单提交 代码供参考: ACTION: /* * 另存为 */ @RequestMapping(" ...
- 【Java】Java批量文件打包下载zip
网上看了很多,本文使用ant.jar中的org.apache.tools.zip,页面用js表单提交 代码供参考: ACTION: /* * 另存为 */ @Request ...
- 使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip
<?php //获取文件列表 function list_dir($dir){ $result = array(); if (is_dir($dir)){ $file_dir = scandir ...
随机推荐
- cocos2dx集成友盟社会化分享图片崩溃问题
本人不懂oc,一步一步按照友盟的文档做,好不容易把分享做好了,结果在 分享图片的时候宕掉了.各种测试,搞了一下午终于搞定了. 如下是友盟文档的做法,错误就在[UIImage imageNamed:@& ...
- excel鼠标拖选慢shift选择快的问题
今天遇到个惊天大坑,关于excel的,最近,一直在调查这个东西,刚开始真的是毫无头绪,反正现在就是excel的值的copy会偶尔慢,慢的情况也是不明白,就是稀里糊涂的调查. 刚开始连100%再现这个b ...
- ubuntu 12.04下apache 配置家目录地址
apache2 最在搞前端相关的东西,上一次也记录了 Linux 下 LAMP环境的搭建,现在记录一下如果改变 apache2 的家目录地址该怎么做,改那个配置文件 修改配置文件 /etc/apach ...
- shell中日期操作
1. date -d操作 date +"%Y%m%d" -d "+n days" #今天的后n天日期 date +"%Y%m%d" -d & ...
- CSS(七):浮动
一.float属性取值:left:左浮动right:右浮动none:不浮动 先看下面的一个例子: <!DOCTYPE html> <html lang="en"& ...
- C++ 运算符重载一(二元运算符重载)
//二元运算符重载 #include<iostream> using namespace std; class Point { public: Point(int x,int y){ th ...
- Linux 串口编程
今天对应用层串口编程进行了验证.程序来源于以下参考链接,自己进行了一些注释和更改,记录于此. Tony Liu, 2016-6-17, Shenzhen 参考链接 https://www.ibm.co ...
- 【BZOJ】3172: [Tjoi2013]单词(后缀自动机)
http://www.lydsy.com/JudgeOnline/problem.php?id=3172 随便搞个sam就行了.(其实一开始看到数据n<=200, 单词长度不超过1e6,然后感觉 ...
- 【BZOJ】1061: [Noi2008]志愿者招募(费用流+数学)
http://www.lydsy.com/JudgeOnline/problem.php?id=1061 好神的一题! 学会了一种建模方式: 当方程组内的任意变量都在其中两个方程出现且一正一负,可以建 ...
- sdut 2158:Hello World!(第一届山东省省赛原题,水题,穷举)
Hello World! Time Limit: 1000MS Memory limit: 65536K 题目描述 We know that Ivan gives Saya three problem ...