zimg icon indicating copy to clipboard operation
zimg copied to clipboard

Java上传图片到Zimg供大家参考

Open hjjoe1213123 opened this issue 9 years ago • 4 comments

import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import javax.imageio.ImageIO;

/**
 * Title: TestImageBinary.java<br/>
 * Description: Java upload Img to Zimg<br/>
 * Copyright: Copyright (c) 2015<br/>
 */
public class TestImageBinary {

    /**
     * Title: main<br/>
     * Description: <br/>
     * @date 2015年8月31日上午11:38:39
     * @param args
     */
    public static void main(String[] args) {
        String url = "http://192.168.21.11/upload/v0";
        System.out.println(sendPost(url,imageBinary()));

    }

    public static byte[] imageBinary() {
        File f = new File("E://7.jpg");
        BufferedImage bi;
        try {
            bi = ImageIO.read(f);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(bi, "jpg", baos);
            byte[] bytes = baos.toByteArray();
            return bytes;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 向指定 URL 发送POST方法的请求
     * @param url  发送请求的 URL
     * @param PostData 请求参数,请求参数应该是 byte[] 的形式。
     * @return 所代表远程资源的响应结果
     */
    public static String sendPost(String url, byte[] PostData, String fileType) {
        OutputStream outStream = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setRequestProperty("Content-Type", macthContentType(fileType));
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            //二进制
            outStream = conn.getOutputStream();
            outStream.write(PostData);
            outStream.flush();

            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally {
            try {
                if (outStream != null) {
                    outStream.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return result;
    } 

    private static String macthContentType(String fileType){
        String contentType = "image/jpeg";
        switch (fileType) {
        case "bmp":
            contentType = "application/x-bmp";
            break;
        case "img":
            contentType = "application/x-img";
            break;
        case "jpeg":
            contentType = "image/jpeg";
            break;
        case "jpg":
            contentType = "application/x-jpg";
            break;
        case "png":
            contentType = "image/png";
            break;
        default:
            break;
        }
        return contentType;
    }
}

hjjoe1213123 avatar Aug 31 '15 06:08 hjjoe1213123

首先感谢分享。

JAVA我没写过,看到你设置的header是("Content-Type", "binary/octet-stream");,但是zimg要求上传时设定这个header为图片的类型,所以你这个发的请求应该会返回错误。

另外,最好加上json解析返回结果的部分,这样一封装就可以作为client library了。

buaazp avatar Aug 31 '15 09:08 buaazp

Java在转换二进制的时候就会把图片的类型加进去,所以header无需再次申明了,特殊情况下会存在问题,修改了类型问题

hjjoe1213123 avatar Sep 02 '15 08:09 hjjoe1213123

Good job!

buaazp avatar Sep 06 '15 05:09 buaazp

已经解决了,不需要使用MultipartEntityBuilder 直接调用ByteArrayEntity 来发送单张图片。

longzhiyou avatar Sep 16 '15 05:09 longzhiyou