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客户端的更多相关文章

  1. java 调用webservice (asmx) 客户端开发示例

    这是本人第一次写博客,其实就是自己做个笔记,写的很粗糙,也希望能给跟我遇到同样问题的你一点帮助. 因为最近有个项目要调用webservice接口,之前接触的都是Java开发服务端和客户端的接口,开发前 ...

  2. 使用Java开发高性能网站需要关注的那些事儿

    无论大型门户网站还是中小型垂直类型网站都会对稳定性.性能和可伸缩性有所追求.大型网站的技术经验分享值得我们去学习和借用,但落实到更具体的实践上并不是对所有网站可以适用,其他语言开发的网站我还不敢多说, ...

  3. 打造Linux三流娱乐环境,二流办公环境,一流Java开发环境

    写这篇文章的目的首先是为让自己以后再装linux环境时候,不用再通宵google+百度,做个备忘录,其次,给新入Linux环境的同学分享一点个人经验,再高尚点的动机也算是想做为开源技术的传播布道者.我 ...

  4. Java开发常用的在线工具

    原文出处: hollischuang(@Hollis_Chuang) 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中 ...

  5. [开发工具]Java开发常用的在线工具

    注明: 本文转自http://www.hollischuang.com/archives/1459.作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工 ...

  6. java开发常用jar包介绍(转载)

    jta.jar 标准JTA API必要 commons-collections.jar 集合类 必要 antlr.jar  ANother Tool for Language Recognition ...

  7. [转]World Wind Java开发之四——搭建本地WMS服务器

    在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...

  8. JAVA开发Web Service几种框架介绍

    郑重声明:此文为转载来的,出处已不知了,侵告删. 在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS( ...

  9. Java开发、网络爬虫、自然语言处理、数据挖掘简介

    一.java开发 (1) 应用开发,即Java SE开发,不属于java的优势所在,所以市场占有率很低,前途也不被看好. (2) web开发,即Java Web开发,主要是基于自有或第三方成熟框架的系 ...

随机推荐

  1. 自定义Django的admin界面

    第6章介绍了Django的admin界面,现在是回过头来仔细看看这个的时候了 我们前面讲的几次admin是Django的"杀手级特性",并且大多数Django开发人员很快爱上了它节 ...

  2. How to add total page to Odoo Report(7.0 version)

    add this codes to your rml file: <drawRightString x="19.5cm" y="0.3cm">Pag ...

  3. c++ 单例模式 对全局变量的替代

    前段时间要实习一个充值接口,创建了一个类(就叫类A好了),这个类A要和另外3个类进行交互,3个类对类A修改的数据是对其他类可见的.这种情况我想到了3个方法: 1.static 静态成员,静态成员为该类 ...

  4. windows-redis 集群搭建

    Windows 配置Reids集群 Redis Cluster 1. 下载安装Redis Redis官方不支持Windows,但是Microsoft Open Tech group在 GitHub上开 ...

  5. c#检查网络文件是否存在

    public bool IsExist(string uri) { HttpWebRequest req = null; HttpWebResponse res = null; try { req = ...

  6. bootstrap基础学习十一篇

    bootstrap下拉菜单(Dropdowns) 下拉菜单是可切换的,是以列表格式显示链接的上下文菜单.如需使用下列菜单,只需要在 class .dropdown 内加上下拉菜单即可. a.代码示例如 ...

  7. 正确的关机方法: sync, shutdown, reboot, halt, poweroff, init

    正常情况下,要关机时需要注意底下几件事: 观察系统的使用状态: 如果要看目前有谁在在线,可以下达『who』这个命令,而如果要看网络的联机状态,可以下达 『 netstat -a 』这个命令, 而要看背 ...

  8. RedHat Ent 6.5 64bit编译安装hadoop2.4.1

    RedHat Ent 6.5 64bit编译安装hadoop2.4.1 感谢原帖:http://blog.csdn.net/w13770269691/article/details/16883663/ ...

  9. Chem 3D中怎么创建立体模型

    ChemDraw作为一款很受大家欢迎的化学绘图软件,其在绘制平面化学方面的功能已经非常的强大了,其实它也可以绘制3D图形.Chem 3D就是绘制3D图形的重要组件.而且为了满足不同的用户绘图的需求,可 ...

  10. 【ask】Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.

    1.周五对nodejs tcp长连接服务器框架进行压测,一切开始比较常规(没什么特殊问题). 2.突然手一哆嗦,把压测用的客户端群一起关闭了. 3.这个时候nodejs的服务器爆出了"Cau ...