前段时间和Flash对接了一个打点功能,java后台提供接口,Flash实现打点功能,将打点好的图片信息传到后台java实现保存图片和打点信息。其中图片是以二进制流的方式传到java后台,图片信息是以XML传到后台保存到数据库。刚开始的实现方式保存图片总是出现损坏,最后放到的图片残缺不全,经过一番调试,最终找到了原因,是在后台写入图片流的时候出现了问题,改了之后一切正常,下面是能够正常执行的代码:
public void addDotPicture(HttpServletRequest request, HttpServletResponse response) throws Exception{ /* 图片保存目录地址,从配置文件读取 */ String serviceImageUrl = "/127.0.0.1/vmsStorage/business"; /* 图片访问目录地址 */ String httpImageUrl = "http://127.0.0.1/vmsStorage/business"; //获取到客服端发过来的流 String picSrcUrl = serviceImageUrl + "/picture"; //图片保存路径 picSrcUrl = PathChange(picSrcUrl); String picName = UUIDUtil.randomUUID() + ".png"; //图片名称(采取自动生成的uuid为图片命名) String picHttpUrl = httpImageUrl + "/picture" + picName; //图片访问路径 StringBuffer result = new StringBuffer(); ServletInputStream in = request.getInputStream(); try { File uploadFile = new File(picSrcUrl, picName); if (!uploadFile.getParentFile().exists()) { uploadFile.getParentFile().mkdirs(); } //检查文件是否已经存在 if (!uploadFile.exists()) { //建立文件 uploadFile.createNewFile(); } FileOutputStream out = new FileOutputStream(uploadFile, true); int len = 0;//每次读取的字节数 byte[] bytes = new byte[2048]; while ((len = in.read(bytes)) != -1) { out.write(bytes, 0, len); } out.flush(); out.close(); picHttpUrl = picHttpUrl.replace("\\", "/"); result.append("<data result=\"true\">") .append("<image url=\"") .append(picHttpUrl) .append("\">") .append("</image>") .append("</data>"); } catch (Exception e) { result.append("<data result=\"false\"></data>"); logger.error(e); }finally{ in.close();//关闭输入流 logger.info("保存图片返回结果:" + result.toString()); writeXML(result.toString(), response); } } /** * 过滤路径,根据系统的输出相应格式的路径 * @param path 输入linux路径 * @return */ public static String PathChange(String path){ if (File.separator.equals("\\")) { path = ExchangePath.linuxPath2WindowsPath(path); } return path; } public static String randomUUID() { String uuid = java.util.UUID.randomUUID().toString(); uuid = uuid.toUpperCase(); uuid = uuid.replaceAll("-", ""); return uuid; } /** * ajax回写xml信息 * @param msg * @throws Exception */ public void writeXML(String msg, HttpServletResponse response) throws Exception { PrintWriter write = null; response.setContentType("application/xml;charset=UTF-8"); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); try { write = response.getWriter(); write.write(msg); write.flush(); } catch (Exception e) { throw new Exception("ajax write error:" + e.getMessage()); } finally { if (write != null) { write.close(); } } }备注:while循环写入文件流的时候需要注意( out.write(bytes, 0, len))。
最后留一句话激励自己:
想象你自己对困难作出的反应,不是逃避或绕开它们,而是面对它们,同它们打交道,以一种进取的和明智的方式同它们奋斗。——马克斯威尔·马尔兹