实现思路:
1.首先你要会单个文件下载的写法,把文件写入到临时文件夹里.
//参考写法
public static String createGyss(LawsuitInfo lawsuit, String fileName) {
//读配置获取想要将文件下载的路径(算是临时目录,将数据传递给浏览器后这里保存的文件可以删除,也可以保留)
String strWorkPath = AppConfig.get("file.work.path") + AppUtils.randomUUID() + "/";
File file = new File(strWorkPath);
OutputStream ops=null;
try {
//创建文件夹
if(!file.exists()) {
file.mkdir();
}
file = new File(strWorkPath + fileName);
if (!file.exists()) {
file.createNewFile();
}
ops = new FileOutputStream(file);
//因为下载的是word,这个方法是渲染word格式的,详情见下方;这里采用的是XWPFDocument这个类来实现文件下载的,你如果下载的是别的类型的文件用自己的下载方式即可,只要把文件下载到指定目录并返回文件全路径即可
XWPFDocument document = LawsuitDocUtils.createDocument(lawsuit);//lawsuit这个变量是文档需要用到的一些文字数据实体类.
document.write(ops);
} catch (Exception ex) {
logger.error("生成word报表发生错误", ex);
} finally {
if (ops != null) {
try {
ops.flush();
ops.close();
} catch (IOException e) {
logger.error("生成word报表发生错误", e);
}
}
}
return strWorkPath + fileName;//返回的是文件下载到的路径
}
//这里就是把不规律的数据处理一下,渲染word格式的
public static XWPFDocument createDocument(LawsuitInfo lawsuitInfo) {
XWPFDocument document = new XWPFDocument();
// 正文
// Map<String, Object> body = (Map<String, Object>) content.get("content");
XWPFParagraph para = document.createParagraph();
para.setAlignment(ParagraphAlignment.CENTER);
XWPFRun run = para.createRun();
run.setText(lawsuitInfo.getTitle());
run.setFontFamily("宋体");
run.setFontSize(15);
run.setBold(true);
run.addBreak();
String account = delLawTag(lawsuitInfo.getAccount());
if (account != null) {
para.setAlignment(ParagraphAlignment.CENTER);
run = para.createRun();
run.setText("来源:"+account);
run.setFontFamily("宋体");
run.setFontSize(10);
run.addBreak();
}
String content = lawsuitInfo.getContent();
if (content != null) {
XWPFParagraph para2 = document.createParagraph();
String[] split = content.split("\n");
for (int i = 0; i < split.length; i++) {
Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
Matcher m = p.matcher(split[i]);
if (m.find()){
String trim = split[i].replaceAll(" ","");
para2.setAlignment(ParagraphAlignment.LEFT);
run = para2.createRun();
run.setText(" "+trim);
run.setFontFamily("宋体");
run.setFontSize(15);
run.addBreak();
}
}
}
return document;
}
2.经过上面的循环,将文件写入指定文件夹,并且返还文件的全路径List集合.这样我们可以调用下面方法,去获取文件的字节数组.
//参考代码
public static byte[] batchCreate(List<String> files, String delDir) {
String strWorkPath = AppConfig.get("file.work.path") + AppUtils.randomUUID() + "/";
File workPath = new File(strWorkPath);
if (!workPath.exists()) {
workPath.mkdirs();
}
//FileUtils这个工具类详情见下方,AppUtils.randomUUID() 是获取随机数的,也就是说第一个参数是zip文件的绝对路径(zip文件会保持到这,后续获取到字节数组后可选择删除)
String zipFile = ZipUtils.zip(strWorkPath + AppUtils.randomUUID() + ".zip", files);
byte[] zipContent = null;
try {
//获取压缩文件的字节数组
zipContent = FileUtils.readFileToByteArray(new File(zipFile));
} catch (IOException ex) {
logger.error("word版本文书内容读取失败", ex);
}
FileUtils.deleteQuietly(new File(strWorkPath));
if (delDir != null) { //删除源文件目录
FileUtils.deleteQuietly(new File(delDir));
}
return zipContent;
}
压缩工具类
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ZipUtils {
private static final Logger logger = LoggerFactory.getLogger(ZipUtils.class);
private static final int BUFFER_SIZE = 4096;
private ZipUtils() {
throw new IllegalStateException("ZipUtils class");
}
public static String zip(String zipFile, List<String> files) {
byte[] buffer = new byte[4096];
ZipOutputStream out = null;
FileInputStream fis = null;
try {
out = new ZipOutputStream(new FileOutputStream(zipFile));
Iterator var5 = files.iterator();
while(var5.hasNext()) {
String file = (String)var5.next();
File temp = new File(file);
fis = new FileInputStream(temp);
out.putNextEntry(new ZipEntry(temp.getName()));
int len;
while((len = fis.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
out.closeEntry();
fis.close();
}
} catch (IOException var21) {
logger.error("文件压缩失败", var21);
} finally {
if (out != null) {
try {
out.close();
} catch (IOException var20) {
logger.error("文件压缩失败", var20);
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException var19) {
logger.error("文件压缩失败", var19);
}
}
}
return zipFile;
}
}
3.将自己数组返回给浏览器响应,实现下载
/**
* 下载案件文书(zip).
*/
@RequestMapping(value = "api/downlod/zip", method = RequestMethod.GET)
public ResponseEntity<byte[]> downloadSimilarCaseByZip(HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = "parameter") String parameter) throws UnsupportedEncodingException {
byte[] contents =amaze("省略上述获取zip字节数组的步骤")
// 设置附件名
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment",AppUtils.encodeFileName( request.getHeader("User-Agent"), "archive"+DateUtils.getNow("YYYYMMddHHmmss") + ".zip"));
//ResponseEntity是这个包下面的org.springframework.http
return new ResponseEntity<>(contents, headers, HttpStatus.OK);
最后:欢迎探讨,不懂得地方可以评论区问我,不足的地方欢迎指出.