将word文件以压缩包的形式,在浏览器下载。实现报错:解压下载的zip文件,显示数据损坏,如图
详细代码如下:
@PostMapping("/exportNewWord")
public AjaxResult exportNewWord(@RequestBody Map<String, Object> params, HttpServletResponse response) {
try {
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
String masterid = params.get("masterid").toString();
String domain = params.get("domain").toString();
Map<String, Object> map = new HashMap<>();
Applysourcepooldetail detailQuery = new Applysourcepooldetail();
detailQuery.setMaterid(Long.valueOf(masterid));
List<Applysourcepooldetail> list = applysourcepooldetailService.selectApplysourcepooldetailList(detailQuery);
if (list.size()>0) {
for (int i = 0; i < list.size(); i++) {
Applysourcepooldetail detail = list.get(i);
if(detail.getInputvalue().contains("</")&&detail.getInputvalue().contains("/>")&&detail.getInputvalue().contains("src=")){
StringBuilder stringBuilder=new StringBuilder(detail.getInputvalue());
if (!stringBuilder.substring(1,7).contains("<img")) {
stringBuilder.insert(3, " ");
}
detail.setInputvalue(stringBuilder.toString());
map.putAll(this.getData(map,detail,domain));
}else{
map.put(detail.getInputfield(), detail.getInputvalue());
}
}
}
WordHtmlGeneratorHelper.handleAllObject(map);
Template t = null;
String filePath="";
if(domain.contains("工业互联网平台服务商")){
filePath = RuoYiConfig.getProfile() + "/template/exportWord.ftl";
configuration.setDirectoryForTemplateLoading(new File(filePath).getParentFile());//模板文件所在路径
t = configuration.getTemplate("exportWord.ftl","UTF-8"); //获取模板文件
}else if(domain.contains("两化融合")){
filePath = RuoYiConfig.getProfile() + "/template/exportLhrhWord.ftl";
configuration.setDirectoryForTemplateLoading(new File(filePath).getParentFile());//模板文件所在路径
t = configuration.getTemplate("exportLhrhWord.ftl","UTF-8"); //获取模板文件
}else if(domain.contains("工业互联网解决方案服务商")){
filePath = RuoYiConfig.getProfile() + "/template/resolveWord.ftl";
configuration.setDirectoryForTemplateLoading(new File(filePath).getParentFile());//模板文件所在路径
t = configuration.getTemplate("resolveWord.ftl","UTF-8"); //获取模板文件
}
File outFile = null;
String fileName = domain;
// s为当前用户桌面所在路径
String tempDir = RuoYiConfig.getProfile()+File.separator;
// fileName = fileName+".doc";
outFile = new File(tempDir,fileName+".doc");
if(!outFile.exists()){
outFile.getParentFile().mkdirs();
}
Writer out = null;
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
t.process(map, out); //将填充数据填入模板文件并输出到目标文件
out.close();
/*压缩*/
String zipFileName = fileName + ".zip";
String zipFilePath = tempDir + zipFileName;
FileOutputStream fos = new FileOutputStream(zipFilePath);
ZipOutputStream zos = new ZipOutputStream(fos);
ZipEntry ze = new ZipEntry(fileName+".doc");
zos.putNextEntry(ze);
FileInputStream fis = new FileInputStream(outFile);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
fis.close();
zos.closeEntry();
zos.flush();
zos.close();
fos.close();
//删除服务器上的临时文件
File deleteFile = new File(tempDir+fileName+".doc");
deleteFile.delete();
return AjaxResult.success(zipFilePath);
}catch (Exception e) {
e.printStackTrace();
}
return AjaxResult.success("1");
}
@PostMapping("/downLoadWord")
public void download(@RequestBody Map<String, Object> params,HttpServletResponse response) throws Exception {
String fileUrl = params.get("fileUrl").toString();
File file = new File(fileUrl);
String zipFileName = file.getName();
String zipFilePath = fileUrl;
/**
* 下载
*/
FileInputStream in = null;
OutputStream out = null;
try {
//获取文件名
String filename = zipFileName;
filename = new String(filename.getBytes("iso8859-1"), "UTF-8");
String downloadpath = zipFilePath;
//设置响应头,控制浏览器下载该文件
response.reset();
response.setCharacterEncoding("UTF-8");
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
//读取要下载的文件,保存到文件输入流
in = new FileInputStream(downloadpath);
//创建输出流
out = response.getOutputStream();
//缓存区
byte buffer2[] = new byte[1024];
int len2 = 0;
//循环将输入流中的内容读取到缓冲区中
while ((len2 = in.read(buffer2)) > 0) {
out.write(buffer2, 0, len2);
out.flush();
}
} finally {
//关闭
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
//删除服务器上的临时文件
// File deleteFile = new File(fileUrl);
// deleteFile.delete();
//删除服务器上的压缩文件
File deleteZipFile = new File(zipFilePath);
deleteZipFile.delete();
}
有没有人指导下