java前后端实现导出图片到压缩包(含导入图片后端)

  • 环境
    数据库里图片的字段用mediumblob类型,可直接存储二进制文件
    导出需要用到apache-ant-zip.jar包,用于压缩文件夹,如果用java自带的会乱码,所以使用apache的包

导入图片后端代码

作者只写了后端的代码~~前端传base64编码格式的内容!由于框架原因,还是使用servlet实现

public class ChfpClassServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2483096664722616128L;
	@Autowired
	private ChfpClassService chfpClassService;
	private Logger log = LoggerFactory.getLogger(ChfpClassServlet.class);

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}

	public void init() throws ServletException {
		chfpClassService = Dispatcher.getBean("chfpClassService");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String arg = req.getParameter("arg");
		if (arg.equals("image")) {
			// ServletInputStream data = req.getInputStream();
			String ret = null;
			log.info("imageServlet");
			try {
				byte[] data = FileServlet.readInputStream(req.getInputStream());
				String dataStr = new String(data, "utf-8");
				Map map = null;
				try {
					map = JSONObject.parseObject(dataStr);

				} catch (JSONException e) {
					// TODO: handle exception
					log.error(e.getMessage());
					return;
				}
				String base64 = (String) map.get("base64");
				base64 = base64.replace("data:image/jpeg;base64,", "");
				String mobile = (String) map.get("mobile");
				String imgName = (String) map.get("imgName");
				String signdate = (String) map.get("signdate");
				byte[] bytes = Base64.decodeFast(base64);
				// System.out.println(bytes.length);
				Map<String, Object> maps = new HashMap<String, Object>();
				maps.put(imgName, bytes);
				maps.put("mobile", mobile);
				maps.put("signdate", signdate);
				chfpClassService.updateImg(maps);
				ret = "{\"result\":0,\"msg\":\"上传成功!\"}";
				ITxnoCache c = Dispatcher.getBean("fileTxnoCache");
				List keyList = new ArrayList<String>();
				int accid = chfpClassService.queryMobileId(mobile);
				String key = String.format("%s=%s=null=null=null", imgName,
						accid + "");
				// System.out.println(key);
				keyList.add(key);
				c.clear(keyList);
				// TODO:清除其他兄弟服务器

				// System.out.println("上传成功");
			} catch (Exception e) {
				e.printStackTrace();
				ret = "{\"result\":1,\"msg\":\"上传失败!\"}";
			} finally {
				if (ret != null) {
					try {
						PrintWriter writer = resp.getWriter();
						writer.write(ret.toCharArray());
						writer.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}

	}

web.xml里的片段

  <servlet>
    <servlet-name>ChfpClassServlet</servlet-name>
    <servlet-class>com.wealth.control.servlet.ChfpClassServlet</servlet-class>
  </servlet>
    <servlet-mapping>
  <servlet-name>ChfpClassServlet</servlet-name>
    <url-pattern>/chfpClass</url-pattern>
  </servlet-mapping>

后台实现导入图片就是这么简单!

前后端实现导出图片到压缩文件夹

  1. servlet代码,初始化过service,为了能使用事务,记得ZipOutputStream 和ZipEntry要用apache的包(org.apache.tools.zip),生成的结果会截断*String fileName=String.format("%s%s%s\%s_%s",map2.get(“CNAME”),map2.get(“PATCH”),map2.get(“BATCH”),map2.get(“MOBILE”),map2.get(“CNAME”));*设置的文件名,注意是两条\
public class ChfpImgServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4885164503517411305L;

	@Autowired
	private ChfpClassService chfpClassService;
	private Logger log = LoggerFactory.getLogger(ChfpImgServlet.class);


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}


	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//String ret = null;
		log.info("imageExport");
		try {
			String dataStr=req.getParameter("idlist");
			List<Object> list=null;
			try {
				list = JSONArray.parseArray(dataStr);

			} catch (JSONException e) {
				// TODO: handle exception
				log.error(e.getMessage());
				return;
			}
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
			   String downFileName = "未命名";
			   try {
				  downFileName = (new String(("CHFP图片列表"+sdf.format(new Date())).getBytes("gbk"),"iso-8859-1")) +".rar";
			    } catch (UnsupportedEncodingException e1) {
			   }
			   resp.setHeader("Content-Disposition", "attachment;filename="+ downFileName);
		       resp.setContentType("application/octet-stream;charset=UTF-8");
		       resp.setHeader("Pragma", "no-cache");
		       resp.setHeader("Cache-Control", "no-cache");
		       resp.setDateHeader("Expires", 0);

			ZipOutputStream out=new ZipOutputStream(resp.getOutputStream());
			List<Map<String, Object>> lists=chfpClassService.queryExcelChfp(ResultUtils.makeQueryMap("list",list));
			for (Map<String, Object> map2 : lists) {
				String fileName=String.format("%s%s%s\\%s_%s",map2.get("CNAME"),map2.get("PATCH"),map2.get("BATCH"),map2.get("MOBILE"),map2.get("CNAME"));
				byte[] idcard_a=(byte[]) map2.get("IDCARD_A");
				byte[] idcard_b=(byte[]) map2.get("IDCARD_B");
				byte[] headphoto=(byte[]) map2.get("HEADPHOTO");
				byte[] certif=(byte[]) map2.get("CERTIF");
				byte[] educ=(byte[]) map2.get("EDUC");
				byte[][] bytes={idcard_a,idcard_b,headphoto,certif,educ};
				zipChfpFiles(out, bytes, fileName);
			}
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void zipChfpFiles(ZipOutputStream out,byte[][] data,String fullFileName){
		String[] typeNames = {"身份证A面","身份证B面","证件照","	培训合格证","学历"};//导出的照片名
	    try {	    	
	      for(int i=0;i<data.length;i++){
	    	  if(data[i]==null || data[i].length==0){
	    		  continue;
	    	  }
	        InputStream in=new ByteArrayInputStream(data[i]);
	        String filename = fullFileName+typeNames[i]+".jpg";
	        //filename=new String(filename.getBytes("utf-8"),"gbk");
	        out.putNextEntry(new ZipEntry(filename));
	        out.setEncoding("gbk");
	        //out.set
	        out.write(data[i]);
	        out.closeEntry();
	        in.close();
	      }
	    } catch (Exception e) {
	    	throw new RuntimeException(e);
	    }
	}
	/**
	 * Initialization of the servlet. <br>
	 * 
	 * @throws ServletException
	 *             if an error occurs
	 */
	public void init() throws ServletException {
		// Put your code here
		chfpClassService = Dispatcher.getBean("chfpClassService");
	}

}
  1. html代码
<a id="export" class="nui-button" onclick="exportExcel1()">导出资料</a>
  1. js代码,功能是可多选导出的
 function exportExcel1() {
			var row = grid.getSelecteds();
			if (row.length > 0) {
				var bardate = row.map(function(x) {
					return x.ACCID
				});
				var baseUrl = '../servlet/ChfpImgServlet';
				handleExport(baseUrl, {
					idlist : JSON.stringify(bardate)
				});
			} else {
				$J.cap4jAlert("请选中一条记录", "提示");
			}
		}
		function handleExport(url, queryParam) {
			var downloadHelper = $(
					'<iframe style="display:none;" id="downloadHelper"></iframe>')
					.appendTo('body')[0];
			var doc = downloadHelper.contentWindow.document;
			if (doc) {
				doc.open();
				doc.write('');//微软为doc.clear()有时会出bug
				doc.writeln("<html><body><form id='downloadForm' name='downloadForm' method='post' action='"+ url+"'>");
				//const queryParam = this.listQuery;
				for (key in queryParam) {
					doc.writeln("<input type='hidden' name='"+key+"' value='"+queryParam[key]+"'>");
				}
				doc.writeln('<\/form><\/body><\html>');
				doc.close();
				const
				form = doc.forms[0];
				if (form) {
					form.submit();
				}
			}
		}
  1. mabatis.xml内容
<select id="queryExcelChfp" resultType="map" >
		select
		cname,mobile,patch,batch,idcard_a,idcard_b,headphoto,certif,educ  from
		activitydb.fin2_act3_chfp_class as cc where accid in (
		<foreach collection="list" separator=","  index="index"  item="item">
		#{item}
		</foreach>)
	</select>
  1. web.xml
<servlet>
    <servlet-name>ChfpImgServlet</servlet-name>
    <servlet-class>com.wealth.control.servlet.ChfpImgServlet</servlet-class>
  </servlet>
   <servlet-mapping>
    <servlet-name>ChfpImgServlet</servlet-name>
    <url-pattern>/servlet/ChfpImgServlet</url-pattern>
  </servlet-mapping>  
  1. 实现效果图:
    在这里插入图片描述
    在这里插入图片描述
    嗯,不乱码还是很不错的!设置了如果选择的内容没有图片,就跳过导出这个用户
    开发中一般使用map传参数,不怎么需要实现类,map也非常方便,但是报错时无法快速定位到bug,还有就是二维数组了,下面加一段代码,看是否有人会需要:

二维数组更换指定列到指定位置上:

f1是目标位置,f2是指定列,从0开始数,不过有个小BUG,f2必须大于f1

	public String[][] swap(String[][] data,int f1,int f2){
		for (int i = 0; i < data.length; i++) {
			String tamp=data[i][f2];
			for (int j = f2; j >f1; j--) {
				data[i][j]=data[i][j-1];
			}
			data[i][f1]=tamp;
		}
		return data;
	}

猜你喜欢

转载自blog.csdn.net/qq_41927845/article/details/86614886
今日推荐