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))。

最后留一句话激励自己:

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

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

时间: 2024-10-29 19:11:17

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

Java模拟POST请求发送二进制数据

在进行程序之间数据通信时我们有时候就需要自定义二进制格式,然后通过HTTP进行二进制数据交互.交互的示例代码如下: public static void main(String[] args) { String result = ""; try { String url = "http://localhost:8080/Demo/SiteApi"; URL realUrl = new URL(url); // 打开和URL之间的连接 URLConnection co

java web中请求和响应中包含中文出现乱码解析

说明:在计算机中保存的一切文本信息是以一定的编码表(0,1,0,1)来保存我们所认识的字符(汉字或英文字符),由字符到计算机存储的二进制过程是编码,由读取二进制到文本的过程称为解码.而字符编码有多种不同的编码表,所以,如果编码格式和解码格式不是同一个码表就会出现乱码.想要避免出现乱码,需要使保存和读取时使用相同的码表. 在java web编程中经常会出现乱码,现在详细讲解一下如何进行设置,避免乱码 1 网页编码 在编写网页的时候,需要指定网页的编码格式,使用<meta http-equiv=&quo

【Servlet】深入浅出Java重定向和请求转发

import java.text.*; import java.util.*; import java.io.*; import javax.servlet.http.*; import javax.servlet.*; import com.bjpowernode.exam.model.*; import com.bjpowernode.exam.manager.*; public class SearchStudentServlet extends HttpServlet { public

java模拟post请求发送json

java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: 1 package main.utils; 2 3 import java.io.*; 4 import java.net.HttpURLConnection; 5 import java.net.URL; 6 7 public class HttpUtilTest { 8 Log log = new Log(this.g

java 实现https请求

java 实现https请求 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以很容易地编程实现对HTTPS站点的访问.但是,如果该站点的证书未经权威机构的验证,JSSE将拒绝信任该证书从而不能访问HTTPS站点.本文在简要介绍JSSE的基础上提出了两种解决该问题的方法. 引言 过去的十几年,网络上已经积累了大量的Web应用.如今,无论是整合原有的Web应用系统,还是进行新的Web开发,都要求通过编程来访问某些Web 页面.传统的方法是使用Socket接口,但现在很多开发平台或工具如

java使用线程请求访问每次间隔10分钟连续5次,之后停止请求

java使用线程请求访问每次间隔10分钟连续5次,收到相应的时候停止请求 package com.qlwb.business.util; /** * * * @类编号: * @类名称:RequestTask * @内容摘要: 若开发者发出了回调通知,却没有收到兑吧ok响应时,开发者需重试5次,每次间隔10分钟. * @author:鹿伟伟 * @创建日期:2016年4月15日 下午4:25:20 * @修改人: * @修改日期: * @修改描述:简单描述修改的内容 * @version 1.0.

java 模拟http请求

整理一下用java模拟http请求的方法,如果有不正确的地方希望大家指正,如果大家有什么更好的方法欢迎提出 1.URLConnection可以向URL地址发送请求,读取URL的资源.建立和URL的连接通常需要一下几步: 创建URL对象,并通过调用openConnection方法获得URLConnection对象: 设置URLConnection参数和普通请求属性: 向远程资源发送请求: 远程资源变为可用,程序可以访问远程资源的头字段和通过输入流来读取远程资源返回的信息. import java.

java 后台 post请求 携带参数 远程操作 调用接口

package com.huayu.tizong.matchteam.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.MalformedURLException; import java.ne

java如果去请求一个网页的数据

我们可以通过在java程序中模拟浏览器一样,把数据抓下来,具体方法是在java程序中set header和cookie,下面是一个例子: public class NetConnection { public static final int MAX_HOTWORDS_FILE_SIZE = 256 * 1024; public static void main(String[] args) { send("http://tuan.aibang.com/shenzhen/new_2033549.