Contexte : Le projet nécessite la fonction de classer et de regrouper tous les fichiers du processus dans des packages compressés à télécharger. Le code est très simple et nécessite principalement l'assemblage de fichiers classifiés.
@GetMapping("/download")
public void download(HttpServletRequest request, HttpServletResponse response,String spxxId) throws Exception {
long timeCode = DateUtils.getMillis();
YwTySpxx spxx = spxxService.getById(spxxId);
if(null==spxx){
return;
}
YwItem item = ywItemService.getById(spxx.getYwid());
YwBpmLcxx lcxx = bpmLcxxService.getById(spxx.getSplx());//流程主表
//查询任务历史表按照时间正序需要根据lcxx去重
List<YwBpmRwrz> list = ywBpmRwrzService.list(new QueryWrapper<YwBpmRwrz>()
.eq("ywid", spxx.getYwid())
.eq("lcid", spxx.getSplx())
.orderByAsc("create_time")
);
ArrayList<YwBpmRwrz> collect = list.stream().collect(Collectors.collectingAndThen
(Collectors.toCollection(() -> new TreeSet<YwBpmRwrz>(Comparator.comparing(YwBpmRwrz::getHjid))), ArrayList::new));
//循环节点信息 查询表
List<Map<String,String>> dowloadList = new ArrayList<>();
for(YwBpmRwrz rz : collect){
String hjid = rz.getHjid();
YwBpmLcxxHjxx hjxx = lcxxHjxxService.getById(hjid);
String rwcldz = hjxx.getRwcldz();
String sqls = " select table_name from onl_cgform_head where id='" + rwcldz+"'";
JSONObject one = sqlService.one(sqls);
String tableName = one.getString("table_name");
List<JSONObject> list1 = sqlService.list("SELECT field_show_type,db_field_name,db_field_txt FROM onl_cgform_field where cgform_head_id ='" + rwcldz+"'");
StringBuilder sb = new StringBuilder();
sb.append(" select ");
List<String> colum = new ArrayList<>();
List<String> colum2 = new ArrayList<>();
for(JSONObject jsonObject : list1){
String field_show_type = jsonObject.getString("field_show_type");
if("file".equals(field_show_type)||"img_water".equals(field_show_type)||"image".equals(field_show_type)){
sb.append(jsonObject.getString("db_field_name")).append(",");
colum.add(jsonObject.getString("db_field_name"));
colum2.add(jsonObject.getString("db_field_txt"));
}
}
String substring = sb.toString().substring(0, sb.toString().length() - 1);
String sql = substring + " from "+tableName+" where id='"+spxx.getYwid()+"'";
JSONObject one1 = sqlService.one(sql);
for(int i =0;i<colum.size();i++){
if(null!=one1){
String string = one1.getString(colum.get(i));
if(StringUtils.isNotBlank(string)){
String s = string.replaceAll("\\[", "")
.replaceAll("\\]", "")
.replaceAll("\"", "");
String[] split = s.split(",");
List<String> strings = Arrays.asList(split);
for(String str : strings){
Map<String,String> map = new HashMap<>();
map.put("path1",hjxx.getHjmc());
map.put("path2",colum2.get(i));
//String onlinePath=systemConfigService.valueByCode("portalUrl").toString();
//服务器更换需要
//str.replace(onlinePath,onlinePath);
//String suffix = str.substring(str.lastIndexOf("\\/"));
String suffix = str.substring(str.lastIndexOf("."));//取后缀
map.put("url",str);
map.put("path3",DateUtils.getMillis()+(int)((Math.random()*9+1)*100000)+suffix);
dowloadList.add(map);
}
}
}
}
}
//压缩包名称
String downloadFilename = item.getItemName()+"-"+lcxx.getLcmc()+"-"+timeCode+".zip";//文件的名称
downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");//转换中文否则可能会产生乱码
response.setContentType("application/octet-stream");// 指明response的返回对象是文件流
response.setHeader("Content-Disposition", "attachment;filename=" + downloadFilename);// 设置在下载框默认显示的文件名
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
for(Map<String,String> map : dowloadList){
String path1 = map.get("path1");//文件路径
String path2 = map.get("path2");//文件路径
String path3 = map.get("path3");//文件
URL url = new URL(map.get("url"));
ZipEntry zipEntry = new ZipEntry(path1+"/"+path2+"/"+path3);
zos.putNextEntry(zipEntry);
InputStream fis =null;
try {
fis = url.openConnection().getInputStream();
}catch (Exception e){
if(null!=fis){
fis.close();
}
}
byte[] buffer = new byte[1024];
int r = 0;
while ((r = fis.read(buffer)) != -1) {
zos.write(buffer, 0, r);
}
fis.close();
}
zos.flush();
zos.close();
}