代码如下:
//进入课程学习-下载课程文档 调用浏览器各自的下载方式
@RequestMapping(value = "downloadDocFiles")
public String downloadDocFiles(String courseId, HttpServletResponse response) throws IOException, URISyntaxException {
List<ResourceCourseware> CoursewareList = resourceCoursewareService.findListByCourseId(courseId);
ArrayList<ResourceFile> totalFileList = new ArrayList<>();
//循环该课程下所有课件
for (ResourceCourseware aCoursewareList : CoursewareList) {
logger.debug("==Evan==CoursewareList" + aCoursewareList);
ResourceFile resourceFile = new ResourceFile();
resourceFile.setResourceId(aCoursewareList.getId());
resourceFile.setType(ResourceConstants.documentMateria);
List<ResourceFile> fileList = resourceFileService.findList(resourceFile);
//循环所有课件下的所有文档
for (ResourceFile aFileList : fileList) {
logger.debug("==Evan==aFileList" + aFileList);
totalFileList.add(aFileList);
}
}
logger.debug("==Evan==totalFileNum: " + totalFileList.size() + " totalFileList: " + totalFileList);
response.setCharacterEncoding("utf-8");
response.setContentType("APPLICATION/OCTET-STREAM");
//设置content-disposition响应头控制浏览器以下载的形式打开文件,中文文件名要使用URLEncoder.encode方法进行编码,否则会出现文件名乱码
// SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
// response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode( "课程文档" + sdf.format(new Date()) + ".zip", "UTF-8"));
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode( resourceCourseService.get(courseId).getCourseName() + "_课程文档" + ".zip", "UTF-8"));
//创建输出流
OutputStream os = response.getOutputStream();
byte[] buf = new byte[1024];
try {
//ZipOutputStream类:完成文件或文件夹的压缩
ZipOutputStream out = new ZipOutputStream(os);
for (ResourceFile aTotalFileList : totalFileList) {
FileInputStream fis = new FileInputStream(aTotalFileList.getLocalUrl());
out.putNextEntry(new ZipEntry(aTotalFileList.getName()));
int len;
while ((len = fis.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.closeEntry();
fis.close();
}
out.flush();
out.close();
logger.debug("Evan========压缩完成!!!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}