Java permet de diviser plusieurs fichiers en dossiers et de les compresser en packages compressés pour le téléchargement

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();
	 }

Guess you like

Origin blog.csdn.net/weixin_41018853/article/details/128083423