惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
小众软件
小众软件
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
F
Fortinet All Blogs
T
Tailwind CSS Blog
Martin Fowler
Martin Fowler
I
InfoQ
The GitHub Blog
The GitHub Blog
有赞技术团队
有赞技术团队
The Cloudflare Blog
罗磊的独立博客

博客园 - 程序员老刘

SaaS多租户改造Spring项目核心代码 windows11的vmware启动报错 MySQL8的root帐号授权 centrifugal 的IM消息服务历史消息报错 支持restart的启动脚本 golang strings.Split的疑问 golang的极简流式编程实现 golang 常用的日期方法和时区的坑 golang SQLite3性能测试 golang的多协程实践 golang redis的模式订阅 golang 实现并发计算文件数量 CAS单点登录实践(spring cas client配置) 81进制,用多进制方式把一个长长的整数变短 chrome浏览器自动填充失效问题 spring 登录提示 Bad credentials spring 项目tomcat 8.0.2 发布报错:Could not initialize class org.hibernate.validator.engine.ConfigurationImpl spring tiles界面为空白 activiti部署到linux后流程图不显示汉字的问题
java开发的zimg客户端
程序员老刘 · 2015-10-28 · via 博客园 - 程序员老刘

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");