首页 > 代码库 > Java实现Flash请求的二进制流图片保存并返回XML信息包含图片访问地址

Java实现Flash请求的二进制流图片保存并返回XML信息包含图片访问地址

       前段时间和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))。

最后留一句话激励自己:
       想象你自己对困难作出的反应,不是逃避或绕开它们,而是面对它们,同它们打交道,以一种进取的和明智的方式同它们奋斗。——马克斯威尔·马尔兹