- 页面:这个页面我用的是原生的table来产生表格的
//选择好需要下载的文件后,触发事件的按钮
<input type="button" value="批量下载" onclick="batchDownLoad()">
...
<c:forEach items="${list}" var="fileItem">
<tr>
<td>
//后台将文件的服务器路径传到这
<input id="filePath" value="${fileItem.filePath}" type="hidden">
//后台将文件的名称传到这
<input id="fileName" value="${fileItem.fileName}" type="hidden">
//这个是为了这里没什么用,不过如果到时候需要定为到这个位置,就可以写上
<input id="${fileItem.id}" value="${fileItem.id}" type="hidden">
//这是一个选择需要下载的复选框
<input id="selectIds" value="${fileItem.id}" type="checkbox">
</td>
</tr>
</c:forEach>
...
- js部分,这里需要模拟用form表单提交,切记不要用ajax请求,不然浏览器就不会接收到后台传过来的文件流,就不能下载了
function batchDownLoad() {
var selectIds = [];
$("input[name='selectIds']:checked").each(function () {
selectIds.push($(this).val());
});
if (selectIds.length<1){
$("#errorMsg").text("请至少选择一条信息下载");
return false;
} else {
$("#errorMsg").text("");
}
if (confirm("是否批量下载?")) {
var filePaths = [];
var fileNames = [];
for (var i in selectIds){
var filePath = $("#"+selectIds[i]).parent().find("input:eq(0)").val();
var fileNameTemp = $("#"+selectIds[i]).parent().find("input:eq(1)").val();
var fileName = encodeURIComponent(fileNameTemp);
filePaths.push(filePath);
fileNames.push(fileName);
}
var url = "${ctx}/commom/fileBatch/fileDownLoadBatch";
var form = $("<form></form>").attr("action",url).attr("method","post");
form.append($("<input></input>").attr("type","hidden").attr("name","fileNames").attr("value",fileNames.toString()));
form.append($("<input></input>").attr("type","hidden").attr("name","filePaths").attr("value",filePaths.toString()));
form.appendTo('body').submit().remove();
}
}
- 后台处理
package com.etc.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.sql.Savepoint;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@Controller
@RequestMapping(value = "${xxx}/commom/fileBatch")
public class FileDownLoadBatchController {
private final static String ZIP_NAME = "file.zip";
@RequestMapping(value = "/fileDownLoadBatch")
public void fileDownLoadBatch(String[] filePaths, String[] fileNames, HttpServletRequest request, HttpServletResponse response){
String tmpFileName = ZIP_NAME;
String filePathTemp = "临时文件的存放位置,自己设置,记得是服务器的位置";
byte[] buffer = new byte[1024];
try {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(filePathTemp+ File.separator+tmpFileName));
for (int i = 0;i<filePaths.length;i++){
String fileName = java.net.URLDecoder.decode(fileNames[i],"UTF-8");
File file = new File(getRealPath(filePaths[i],fileName));
if(file.exists()){
FileInputStream fis = new FileInputStream(getRealPath(filePaths[i],fileName));
out.putNextEntry(new ZipEntry(fileName));
out.setEncoding("GBK");
int len;
while ((len = fis.read(buffer))>0){
out.write(buffer,0,len);
}
out.closeEntry();
fis.close();
}else {
File fileTemp = new File(filePathTemp + File.separator + "文件已被删除" + fileName);
fileTemp.createNewFile();
FileInputStream fis = new FileInputStream(filePathTemp + File.separator + "文件已被删除" + fileName);
out.putNextEntry(new ZipEntry("文件已被删除" + fileName));
out.setEncoding("GBK");
int len;
while ((len = fis.read(buffer)) > 0){
out.write(buffer,0,len);
}
out.closeEntry();
fis.close();
fileTemp.delete();
}
}
out.close();
SaveAs(filePathTemp+File.separator+tmpFileName,tmpFileName,request,response);
}catch (Exception e){
e.printStackTrace();
}
}
private String getRealPath(String filePath,String fileName){
return filePath+File.separator+fileName;
}
public void SaveAs(String filePath,String fileName,HttpServletRequest request,HttpServletResponse getResponse){
try {
File file = new File(filePath);
request.getHeader("User-Agent").toUpperCase();
getResponse.setHeader("Content-Disposition","attachment;filename=\""+new String(fileName.getBytes(),"ISO8859-1")+"\"");
getResponse.setContentType("application/zip");
InputStream ins = new FileInputStream(filePath);
OutputStream outs = getResponse.getOutputStream();
int byteRead = 0;
byte[] buffer = new byte[8192];
while ((byteRead = ins.read(buffer))>0){
outs.write(buffer,0,byteRead);
}
outs.flush();
ins.close();
outs.close();
file.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
}