Java实现Flash请求的二进制流图片保存并返回XML信息包含图片访问地址
2014-06-21 15:06
711 查看
前段时间和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))。
最后留一句话激励自己:
想象你自己对困难作出的反应,不是逃避或绕开它们,而是面对它们,同它们打交道,以一种进取的和明智的方式同它们奋斗。——马克斯威尔·马尔兹
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调用webservice天气预报(SOAP请求的方式获取天气信息并解析返回的XML)
- Java接收Flash请求的二进制流图片
- java调用webservice天气预报(SOAP请求的方式获取天气信息并解析返回的XML)
- java调用webservice天气预报(SOAP请求的方式获取天气信息并解析返回的XML)
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- 用一个WEB服务或普通站点 实现这样一个效果?以URL请求,返回一个XML文档
- java网络编程二:服务器处理多个用户请求的解决方案(返回多个用户输入的信息)
- Flash+xml应用篇:自定义事件返回xml信息
- java cookie 实现用户账号信息本地保存
- java网络编程二:服务器处理多个用户请求的解决方案(返回多个用户输入的信息)
- 写了一段VBA代码后, Excel每次保存时都弹出警告:”此文档中包含宏、Activex控件、XML扩展包信息“(office 2007)
- java Web项目中,利用其过滤功能,实现访问者每次访问服务器时,记录访问者的IP,访问时间,Url等信息,并保存到文件的操作
- flash AS +xml 加载图片(使用MovieClipLoader实现LOADING)
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- SEO_ASP.net SEO优化(包含URL地址重写\viewState移动和压缩至服务器\SEO信息XML生成_根据URL地址重写文件)\web网站内容压缩 源码公开.本人授权可使用于商业项目。
- java通过http的图片地址获取图片并保存
- 用flash as3截取摄像头图片信息交由php保存[flash+php保存图片]
- Java XML存取二进制图片信息
- android---实现登录用户信息保存(XML)
- java cookie 实现用户账号信息本地保存