java开发的zimg客户端
1、zimg的安装部署
最开始的时候是下载zimg的源码安装的,由于zimg依赖项众多,没有安装成功,刚好那期间在学习docker,于是docker search zimg一下,惊奇的发现有zimg镜像。
镜像名:iknow0612/zimg
docker pull iknow0612/zimg
运行zimg的方法(开发用,没有该配置,简单的做了图片存储位置的映射,重启后上传的图片还在。docker的实例名称很重要,同一主机的docker容器间通信最好用--link,IP有时候不太稳定)
docker run -it -d -p 4869:4869 -v /home/liuzhijun/zimg/images:/zimg/bin/img --name guttv_zimg iknow0612/zimg sh app.sh
2、java客户端代码
package com.guttv.common.utils; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLConnection;
import java.util.List; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest; import com.google.gson.Gson;
import com.guttv.common.utils.ZimgClient.ZimgResult; public class ZimgClient {
public static String zimgUrl = "http://192.168.1.221:4869/";
public static String zimgShareUrl = "http://192.168.1.221:4869/";
public static String tmpPath = "/var/guttv/logs/tmp";
protected Logger logger = LoggerFactory.getLogger(getClass()); public static void main(String[] args) {
// 从文件上传图片
ZimgResult ret0 = new ZimgClient()
.uploadImg("/var/guttv/logs/tmp/gophercolor.png");
System.out.println(ret0.isRet() + "\r\n" + ret0.getImageUrl());
// 从URL上传图片
ZimgResult ret = new ZimgClient()
.uploadImgFromUrl("http://creatives.ftchinese.com/ads/beijing/201509/20150914_cartier_33660.gif");
System.out.println(ret.isRet() + "\r\n" + ret.getImageUrl());
// Send("http://192.168.1.221:4869/upload",
// "c:/4c422e03jw1ejoqm5ghm0j20nl0fb76x.jpg", "jpg");
} /**
* 从页面提交图片,上传到zimg
*
* @param request
* @param fileTag
* @return
*/
public String uploadImgToZimg(HttpServletRequest request, String fileTag) {
String imgUrl = "";
MultipartHttpServletRequest mhs = (MultipartHttpServletRequest) request;
List<MultipartFile> files = mhs.getFiles(fileTag);
if (files != null && files.size() > 0) {
// 上传到图片服务器
MultipartFile f = files.get(0);
if (f.getSize() == 0)
return "";
String tmpFileName = ZimgClient.tmpPath + "/"
+ f.getOriginalFilename();
// mkdir("./tmp")
File tmp = new File(ZimgClient.tmpPath);
tmp.mkdir();
tmp = new File(tmpFileName);
try {
// tmp.delete();
f.transferTo(tmp);
} catch (Exception e) {
e.printStackTrace();
} ZimgResult ret = this.uploadImg(tmpFileName);
logger.debug(new Gson().toJson(ret));
if (ret != null && ret.isRet())
imgUrl = ret.getImageUrl(); // 删除文件
if (tmp != null) {
tmp.setWritable(true);
// try {
// new FileOutputStream(tmp).close();
// } catch (Exception e) {
// e.printStackTrace();
// }
System.gc();// java'bug,must be gc before delete
tmp.delete();
}
} return imgUrl;
} /**
* 指定文件名,上传到zimg
*
* @param fileName
* @return
*/
public ZimgResult uploadImg(String fileName) {
String ext = "jpeg";
int inx = fileName.lastIndexOf(".");
if (inx > 0)
ext = fileName.substring(inx + 1);
String resp = this.Send(ZimgClient.zimgUrl + "upload", fileName, ext);
return new Gson().fromJson(resp, ZimgResult.class);
} public ZimgResult uploadImgFromUrl(String url) {
String resp = this.SendFromUrl(url);
return new Gson().fromJson(resp, ZimgResult.class);
} /**
* 从指定的URL下载图片并上传到zimg服务器
*
* @param zimgUrl
* @param imgUrl
* @return
*/
protected String SendFromUrl(String imgUrl) { // 设置文件类型默认值
String ext = "jpeg";
String respXML = "";
try {
// 获得connection对象
logger.debug("zimg server url:" + ZimgClient.zimgUrl);
URL zimgUL = new URL(ZimgClient.zimgUrl);
URLConnection zimgConnection = zimgUL.openConnection();
zimgConnection.setReadTimeout(50000);
zimgConnection.setConnectTimeout(25000);
HttpURLConnection zimgUC = (HttpURLConnection) zimgConnection; // 设置HTTP协议的消息头
logger.debug("zimg set header");
zimgUC.setRequestMethod("POST");
zimgUC.setRequestProperty("Connection", "Keep-Alive");
zimgUC.setRequestProperty("Cache-Control", "no-cache");
zimgUC.setRequestProperty("Content-Type", ext.toLowerCase());// "jpeg");//
zimgUC.setRequestProperty("COOKIE", "william");
zimgUC.setDoOutput(true);
zimgUC.setDoInput(true); logger.debug("zimg connect server.");
// 与建立服务器连接
zimgUC.connect();
// 设置传输模式为二进制
logger.debug("zimg upload image in binary.");
OutputStream om = zimgUC.getOutputStream();
// 循环读取图片,发送到zimg服务器 ext = this.writeImage(imgUrl, om);
logger.debug("image type=" + ext);
// byte[] buf = new byte[8192];
// while (true) {
// int len = in.read(buf);
// if (len <= 0)
// break;
// om.write(buf, 0, len);
// } // 到开输入(返回信息)流
InputStreamReader im = new InputStreamReader(
zimgUC.getInputStream(), "UTF-8");
// 循环读取,知道结束,获取返回信息
logger.debug("zimg get response text.");
char[] bb = new char[8192];
while (true) {
int length = im.read(bb);
if (length == -1)
break;
char[] bc = new char[length];
for (int i = 0; i < length; i++)
bc[i] = bb[i];
respXML += new String(bc);
}
logger.debug("zimg response:" + respXML);
// 关闭上下行
im.close();
zimgUC.disconnect();
} catch (Exception e) {
logger.debug("zimg exception :" + e.getMessage());
e.printStackTrace();
} return respXML; } /**
* 返货图片类型
*
* @param data
* @return
*/
protected String getImageType(byte[] data) {
String type = null;
// Png test:
if (data[1] == 'P' && data[2] == 'N' && data[3] == 'G') {
type = "PNG";
return type;
}
// Gif test:
if (data[0] == 'G' && data[1] == 'I' && data[2] == 'F') {
type = "GIF";
return type;
}
// JPG test:
if (data[6] == 'J' && data[7] == 'F' && data[8] == 'I'
&& data[9] == 'F') {
type = "JPG";
return type;
}
return type;
} /**
* 获取URL的输入流
*
* @param imgUrl
* @return
*/
private String writeImage(String imgUrl, OutputStream om) {
long totalBytes = 0;
String imgType = "jpeg";
try {
// 获得connection对象
URL imgUL = new URL(imgUrl);
URLConnection imgConnection = imgUL.openConnection();
imgConnection.setReadTimeout(50000);
imgConnection.setConnectTimeout(25000);
HttpURLConnection imgUC = (HttpURLConnection) imgConnection; // 设置HTTP协议的消息头
logger.debug("set header");
imgUC.setRequestMethod("GET");
imgUC.setRequestProperty("Connection", "Keep-Alive");
imgUC.setRequestProperty("Cache-Control", "no-cache");
// imgUC.setRequestProperty("Content-Type", ext.toLowerCase());//
// "jpeg");//
imgUC.setRequestProperty("COOKIE", "GostLiu程序员老刘");
imgUC.setDoOutput(true);
imgUC.setDoInput(true);
InputStream in = imgUC.getInputStream(); byte[] buf = new byte[8192];
boolean GotType = false;
while (true) {
int len = in.read(buf);
if (len <= 0)
break;
if (!GotType) {
imgType = this.getImageType(buf);
GotType = true;
}
totalBytes += len;
om.write(buf, 0, len);
}
in.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
if (totalBytes > 0)
return imgType;
else
return "";
} /**
* 将图片文件上传到zimg服务器
*
* @param url
* @param fileName
* @param ext
* @return
*/
protected String Send(String url, String fileName, String ext) { if (ext.toLowerCase().compareTo("jpg") == 0)
ext = "jpeg";
String respXML = "";
try {
// 获得connection对象
logger.debug("zimg server url:" + url);
URL ul = new URL(url);
URLConnection connection = ul.openConnection();
connection.setReadTimeout(50000);
connection.setConnectTimeout(25000);
HttpURLConnection uc = (HttpURLConnection) connection; // 设置HTTP协议的消息头
logger.debug("zimg set header");
uc.setRequestMethod("POST");
uc.setRequestProperty("Connection", "Keep-Alive");
uc.setRequestProperty("Cache-Control", "no-cache");
uc.setRequestProperty("Content-Type", ext.toLowerCase());// "jpeg");//
uc.setRequestProperty("COOKIE", "william");
uc.setDoOutput(true);
uc.setDoInput(true); logger.debug("zimg connect server.");
// 与建立服务器连接
uc.connect();
// 设置传输模式为二进制
logger.debug("zimg upload image in binary.");
OutputStream om = uc.getOutputStream();
// 循环读取图片,发送到zimg服务器
FileInputStream in = new FileInputStream(fileName);
byte[] buf = new byte[8192];
while (true) {
int len = in.read(buf);
if (len <= 0)
break;
om.write(buf, 0, len);
} // 到开输入(返回信息)流
InputStreamReader im = new InputStreamReader(uc.getInputStream(),
"UTF-8");
// 循环读取,知道结束,获取返回信息
logger.debug("zimg get response text.");
char[] bb = new char[8192];
while (true) {
int length = im.read(bb);
if (length == -1)
break;
char[] bc = new char[length];
for (int i = 0; i < length; i++)
bc[i] = bb[i];
respXML += new String(bc);
}
logger.debug("zimg response:" + respXML);
// 关闭上下行
im.close();
uc.disconnect();
} catch (Exception e) {
logger.debug("zimg exception :" + e.getMessage());
e.printStackTrace();
} return respXML; } /********** zimg 服务器返回消息定义 ***********************************/
public class ZimgError {
private int code;
private String message; public int getCode() {
return code;
} public void setCode(int code) {
this.code = code;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} } public class ZimgInfo {
private String md5; public String getMd5() {
return md5;
} public void setMd5(String md5) {
this.md5 = md5;
} private int size; public int getSize() {
return size;
} public void setSize(int size) {
this.size = size;
}
} public class ZimgResult {
private boolean ret;
private ZimgInfo info;
private ZimgError error; public ZimgError getError() {
return error;
} public void setError(ZimgError error) {
this.error = error;
} public String getImageUrl() {
if (this.isRet()) {
return ZimgClient.zimgShareUrl + this.info.getMd5();
}
return "";
} public boolean isRet() {
return ret;
} public void setRet(boolean ret) {
this.ret = ret;
} public ZimgInfo getInfo() {
return info;
} public void setInfo(ZimgInfo info) {
this.info = info;
} }
}
3、用法
该类提供了三个用法:
a、从文件上传:
ZimgResult ret0 = new ZimgClient()
.uploadImg("/var/guttv/logs/tmp/gophercolor.png");
b、从url直接上传
ZimgResult ret = new ZimgClient()
.uploadImgFromUrl("http://creatives.ftchinese.com/ads/beijing/201509/20150914_cartier_33660.gif");
c、从页面提交上传,uploadImgToZimg
包含两个参数HttpServletRequest request和String fileTag,页面上要存在一个type是file类型的input标签,其name的值就是这里的fileTag,即下面例子中的posterFile。
本例中使用了spring的MultipartHttpServletRequest,因此调用者要支持spring。
String imgUrl = new ZimgClient().uploadImgToZimg(request,
"posterFile");
java开发的zimg客户端的更多相关文章
- java 调用webservice (asmx) 客户端开发示例
这是本人第一次写博客,其实就是自己做个笔记,写的很粗糙,也希望能给跟我遇到同样问题的你一点帮助. 因为最近有个项目要调用webservice接口,之前接触的都是Java开发服务端和客户端的接口,开发前 ...
- 使用Java开发高性能网站需要关注的那些事儿
无论大型门户网站还是中小型垂直类型网站都会对稳定性.性能和可伸缩性有所追求.大型网站的技术经验分享值得我们去学习和借用,但落实到更具体的实践上并不是对所有网站可以适用,其他语言开发的网站我还不敢多说, ...
- 打造Linux三流娱乐环境,二流办公环境,一流Java开发环境
写这篇文章的目的首先是为让自己以后再装linux环境时候,不用再通宵google+百度,做个备忘录,其次,给新入Linux环境的同学分享一点个人经验,再高尚点的动机也算是想做为开源技术的传播布道者.我 ...
- Java开发常用的在线工具
原文出处: hollischuang(@Hollis_Chuang) 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中 ...
- [开发工具]Java开发常用的在线工具
注明: 本文转自http://www.hollischuang.com/archives/1459.作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工 ...
- java开发常用jar包介绍(转载)
jta.jar 标准JTA API必要 commons-collections.jar 集合类 必要 antlr.jar ANother Tool for Language Recognition ...
- [转]World Wind Java开发之四——搭建本地WMS服务器
在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...
- JAVA开发Web Service几种框架介绍
郑重声明:此文为转载来的,出处已不知了,侵告删. 在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS( ...
- Java开发、网络爬虫、自然语言处理、数据挖掘简介
一.java开发 (1) 应用开发,即Java SE开发,不属于java的优势所在,所以市场占有率很低,前途也不被看好. (2) web开发,即Java Web开发,主要是基于自有或第三方成熟框架的系 ...
随机推荐
- Oracle基础(三)数据库管理
上篇介绍了Oracle数据库的基本操作指令:增.删.改.查以下针对数据库的管理进行介绍 数据库角色介绍 数据管理员: 至少有一个数据库管理员dba. 职责:安装和升级oracel数据库 建库,表空间 ...
- Unix系统编程()通用模型以外的操作ioctl
之前学习到的都是通用的IO模型,现在要学的是一个ioctl系统调用,ioctl为执行文件和设备提供了一种多用途机制. int ioctl(int fd, int request, - /*argp*/ ...
- mongodb数据库安装与卸载
此处以centos下monggodb3.4版本安装为例,可参考官网安装教程 步骤如下: 1.配置mongodb ym源 vi /etc/yum.repos.d/mongodb-org-3.4.repo ...
- Transporting Data Between Database
The Export utility can provide a logical backup of: Database objects A tablespace An entire database ...
- 让IE6支持min-width和max-width的方法
正如君所想象的一样,同实现层的fixed一样,用的是expression语句.例如div#demo在: IE6下最小宽度300px: 或 *html div#demo { width:expres ...
- find命令结合cp bash mv 命令使用的4种方式
工作经常需要用find结合其它命令一起使用,下面介绍4种结合方式. 例: 用find查找/data目录下,以.txt文件结尾的文件并复制到/tmp下 方法一 find与|xargs是黄金搭档,-t 参 ...
- 支持IE低版本的上传 大文件切割上传 断点续传 秒传
1. http://files.cnblogs.com/files/blackice/UploadDemo.rar 此demo是使用的 swfupload 2.http://download.csdn ...
- 2018 ACM ICPC 南京赛区 酱油记
Day 1: 早上6点起床打车去车站,似乎好久没有这么早起床过了,困到不行,在火车上睡啊睡就睡到了南京.南航离南京南站很近,地铁一站就到了,在学校里看到了体验坐直升机的活动,感觉很强.报道完之后去吃了 ...
- 使用StringTokenizer分解字符串
Java切割字符串.一般使用substring.split.StringTokenizer来处理,前两种是String对象的方法,使用字符串能够直接处理,本文介绍下StringTokenizer的使用 ...
- C++ TR1、TR2与boost的关系
C++ Technical Report 1 (TR1)是ISO/IEC TR 19768, C++ Library Extensions(函式库扩充)的一般名称.TR1是一份文件,内容提出了对C++ ...