開發與維運

阿里雲圖像識別Java調用示例參考

作者:俏巴

概述

圖像識別服務(Image Recognition)基於大數據和深度學習實現,可精準識別圖像中的視覺內容,包括上千種物體標籤、數十種常見場景等,包含場景分類、圖像打標、鑑黃等在線API服務模塊,應用於智能相冊管理、圖片分類和檢索、圖片安全監控等場景。下面給出使用Java語言分別使用網絡圖片和本地圖片調用場景識別API的示例。


控制檯測試

與人臉識別類似,可以參考:阿里雲人臉識別使用流程簡介

Java Code Sample

使用網絡圖片測試

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Encoder;
import javax.crypto.Mac;

//@SuppressWarnings("restriction")
public class ComputerDemo1 {

<span class="hljs-comment">/*
 * 計算MD5+BASE64
 */</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> MD5Base64(<span class="hljs-built_in">String</span> s) {
    <span class="hljs-keyword">if</span> (s == <span class="hljs-literal">null</span>)
        <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
    <span class="hljs-built_in">String</span> encodeStr = <span class="hljs-string">""</span>;
    byte[] utfBytes = s.getBytes();
    MessageDigest mdTemp;
    <span class="hljs-keyword">try</span> {
        mdTemp = MessageDigest.getInstance(<span class="hljs-string">"MD5"</span>);
        mdTemp.update(utfBytes);
        byte[] md5Bytes = mdTemp.digest();
        BASE64Encoder b64Encoder = <span class="hljs-keyword">new</span> BASE64Encoder();
        encodeStr = b64Encoder.encode(md5Bytes);
    } <span class="hljs-keyword">catch</span> (Exception e) {
        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Failed to generate MD5 : "</span> + e.getMessage());
    }
    <span class="hljs-keyword">return</span> encodeStr;
}
<span class="hljs-comment">/*
 * 計算 HMAC-SHA1
 */</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> HMACSha1(<span class="hljs-built_in">String</span> data, <span class="hljs-built_in">String</span> key) {
    <span class="hljs-built_in">String</span> result;
    <span class="hljs-keyword">try</span> {
        SecretKeySpec signingKey = <span class="hljs-keyword">new</span> SecretKeySpec(key.getBytes(), <span class="hljs-string">"HmacSHA1"</span>);
        Mac mac = Mac.getInstance(<span class="hljs-string">"HmacSHA1"</span>);
        mac.init(signingKey);
        byte[] rawHmac = mac.doFinal(data.getBytes());
        result = (<span class="hljs-keyword">new</span> BASE64Encoder()).encode(rawHmac);
    } <span class="hljs-keyword">catch</span> (Exception e) {
        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Failed to generate HMAC : "</span> + e.getMessage());
    }
    <span class="hljs-keyword">return</span> result;
}
<span class="hljs-comment">/*
 * 等同於javaScript中的 new Date().toUTCString();
 */</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> toGMTString(<span class="hljs-built_in">Date</span> date) {
    SimpleDateFormat df = <span class="hljs-keyword">new</span> SimpleDateFormat(<span class="hljs-string">"E, dd MMM yyyy HH:mm:ss z"</span>, Locale.UK);
    df.setTimeZone(<span class="hljs-keyword">new</span> java.util.SimpleTimeZone(<span class="hljs-number">0</span>, <span class="hljs-string">"GMT"</span>));
    <span class="hljs-keyword">return</span> df.format(date);
}
<span class="hljs-comment">/*
 * 發送POST請求
 */</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> sendPost(<span class="hljs-built_in">String</span> url, <span class="hljs-built_in">String</span> body, <span class="hljs-built_in">String</span> ak_id, <span class="hljs-built_in">String</span> ak_secret) throws Exception {
    PrintWriter out = <span class="hljs-literal">null</span>;
    BufferedReader <span class="hljs-keyword">in</span> = <span class="hljs-literal">null</span>;
    <span class="hljs-built_in">String</span> result = <span class="hljs-string">""</span>;
    int statusCode = <span class="hljs-number">200</span>;
    <span class="hljs-keyword">try</span> {
        URL realUrl = <span class="hljs-keyword">new</span> URL(url);
        <span class="hljs-comment">/*
         * http header 參數
         */</span>
        <span class="hljs-built_in">String</span> method = <span class="hljs-string">"POST"</span>;
        <span class="hljs-built_in">String</span> accept = <span class="hljs-string">"application/json"</span>;
        <span class="hljs-built_in">String</span> content_type = <span class="hljs-string">"application/json"</span>;
        <span class="hljs-built_in">String</span> path = realUrl.getFile();
        <span class="hljs-built_in">String</span> date = toGMTString(<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>());
        <span class="hljs-comment">// 1.對body做MD5+BASE64加密</span>
        <span class="hljs-built_in">String</span> bodyMd5 = MD5Base64(body);
        <span class="hljs-built_in">String</span> stringToSign = method + <span class="hljs-string">"\n"</span> + accept + <span class="hljs-string">"\n"</span> + bodyMd5 + <span class="hljs-string">"\n"</span> + content_type + <span class="hljs-string">"\n"</span> + date + <span class="hljs-string">"\n"</span>
                + path;
        <span class="hljs-comment">// 2.計算 HMAC-SHA1</span>
        <span class="hljs-built_in">String</span> signature = HMACSha1(stringToSign, ak_secret);
        <span class="hljs-comment">// 3.得到 authorization header</span>
        <span class="hljs-built_in">String</span> authHeader = <span class="hljs-string">"Dataplus "</span> + ak_id + <span class="hljs-string">":"</span> + signature;
        <span class="hljs-comment">// 打開和URL之間的連接</span>
        URLConnection conn = realUrl.openConnection();
        <span class="hljs-comment">// 設置通用的請求屬性</span>
        conn.setRequestProperty(<span class="hljs-string">"accept"</span>, accept);
        conn.setRequestProperty(<span class="hljs-string">"content-type"</span>, content_type);
        conn.setRequestProperty(<span class="hljs-string">"date"</span>, date);
        conn.setRequestProperty(<span class="hljs-string">"Authorization"</span>, authHeader);
        <span class="hljs-comment">// 發送POST請求必須設置如下兩行</span>
        conn.setDoOutput(<span class="hljs-literal">true</span>);
        conn.setDoInput(<span class="hljs-literal">true</span>);
        <span class="hljs-comment">// 獲取URLConnection對象對應的輸出流</span>
        out = <span class="hljs-keyword">new</span> PrintWriter(conn.getOutputStream());
        <span class="hljs-comment">// 發送請求參數</span>
        out.print(body);
        <span class="hljs-comment">// flush輸出流的緩衝</span>
        out.flush();
        <span class="hljs-comment">// 定義BufferedReader輸入流來讀取URL的響應</span>
        statusCode = ((HttpURLConnection)conn).getResponseCode();
        <span class="hljs-keyword">if</span>(statusCode != <span class="hljs-number">200</span>) {
            <span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(((HttpURLConnection)conn).getErrorStream()));
        } <span class="hljs-keyword">else</span> {
            <span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(conn.getInputStream()));
        }
        <span class="hljs-built_in">String</span> line;
        <span class="hljs-keyword">while</span> ((line = <span class="hljs-keyword">in</span>.readLine()) != <span class="hljs-literal">null</span>) {
            result += line;
        }
    } <span class="hljs-keyword">catch</span> (Exception e) {
        e.printStackTrace();
    } <span class="hljs-keyword">finally</span> {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">if</span> (out != <span class="hljs-literal">null</span>) {
                out.close();
            }
            <span class="hljs-keyword">if</span> (<span class="hljs-keyword">in</span> != <span class="hljs-literal">null</span>) {
                <span class="hljs-keyword">in</span>.close();
            }
        } <span class="hljs-keyword">catch</span> (IOException ex) {
            ex.printStackTrace();
        }
    }
    <span class="hljs-keyword">if</span> (statusCode != <span class="hljs-number">200</span>) {
        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IOException(<span class="hljs-string">"\nHttp StatusCode: "</span>+ statusCode + <span class="hljs-string">"\nErrorMessage: "</span> + result);
    }
    <span class="hljs-keyword">return</span> result;
}
<span class="hljs-comment">/*
 * GET請求
 */</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> sendGet(<span class="hljs-built_in">String</span> url, <span class="hljs-built_in">String</span> ak_id, <span class="hljs-built_in">String</span> ak_secret) throws Exception {
    <span class="hljs-built_in">String</span> result = <span class="hljs-string">""</span>;
    BufferedReader <span class="hljs-keyword">in</span> = <span class="hljs-literal">null</span>;
    int statusCode = <span class="hljs-number">200</span>;
    <span class="hljs-keyword">try</span> {
        URL realUrl = <span class="hljs-keyword">new</span> URL(url);
        <span class="hljs-comment">/*
         * http header 參數
         */</span>
        <span class="hljs-built_in">String</span> method = <span class="hljs-string">"GET"</span>;
        <span class="hljs-built_in">String</span> accept = <span class="hljs-string">"application/json"</span>;
        <span class="hljs-built_in">String</span> content_type = <span class="hljs-string">"application/json"</span>;
        <span class="hljs-built_in">String</span> path = realUrl.getFile();
        <span class="hljs-built_in">String</span> date = toGMTString(<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>());
        <span class="hljs-comment">// 1.對body做MD5+BASE64加密</span>
        <span class="hljs-comment">// String bodyMd5 = MD5Base64(body);</span>
        <span class="hljs-built_in">String</span> stringToSign = method + <span class="hljs-string">"\n"</span> + accept + <span class="hljs-string">"\n"</span> + <span class="hljs-string">""</span> + <span class="hljs-string">"\n"</span> + content_type + <span class="hljs-string">"\n"</span> + date + <span class="hljs-string">"\n"</span> + path;
        <span class="hljs-comment">// 2.計算 HMAC-SHA1</span>
        <span class="hljs-built_in">String</span> signature = HMACSha1(stringToSign, ak_secret);
        <span class="hljs-comment">// 3.得到 authorization header</span>
        <span class="hljs-built_in">String</span> authHeader = <span class="hljs-string">"Dataplus "</span> + ak_id + <span class="hljs-string">":"</span> + signature;
        <span class="hljs-comment">// 打開和URL之間的連接</span>
        URLConnection connection = realUrl.openConnection();
        <span class="hljs-comment">// 設置通用的請求屬性</span>
        connection.setRequestProperty(<span class="hljs-string">"accept"</span>, accept);
        connection.setRequestProperty(<span class="hljs-string">"content-type"</span>, content_type);
        connection.setRequestProperty(<span class="hljs-string">"date"</span>, date);
        connection.setRequestProperty(<span class="hljs-string">"Authorization"</span>, authHeader);
        connection.setRequestProperty(<span class="hljs-string">"Connection"</span>, <span class="hljs-string">"keep-alive"</span>);
        <span class="hljs-comment">// 建立實際的連接</span>
        connection.connect();
        <span class="hljs-comment">// 定義 BufferedReader輸入流來讀取URL的響應</span>
        statusCode = ((HttpURLConnection)connection).getResponseCode();
        <span class="hljs-keyword">if</span>(statusCode != <span class="hljs-number">200</span>) {
            <span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(((HttpURLConnection)connection).getErrorStream()));
        } <span class="hljs-keyword">else</span> {
            <span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(connection.getInputStream()));
        }
        <span class="hljs-built_in">String</span> line;
        <span class="hljs-keyword">while</span> ((line = <span class="hljs-keyword">in</span>.readLine()) != <span class="hljs-literal">null</span>) {
            result += line;
        }
    } <span class="hljs-keyword">catch</span> (Exception e) {
        e.printStackTrace();
    } <span class="hljs-keyword">finally</span> {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">if</span> (<span class="hljs-keyword">in</span> != <span class="hljs-literal">null</span>) {
                <span class="hljs-keyword">in</span>.close();
            }
        } <span class="hljs-keyword">catch</span> (Exception e) {
            e.printStackTrace();
        }
    }
    <span class="hljs-keyword">if</span> (statusCode != <span class="hljs-number">200</span>) {
        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IOException(<span class="hljs-string">"\nHttp StatusCode: "</span>+ statusCode + <span class="hljs-string">"\nErrorMessage: "</span> + result);
    }
    <span class="hljs-keyword">return</span> result;
}
public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(<span class="hljs-built_in">String</span>[] args) throws Exception {
    <span class="hljs-comment">// 發送POST請求示例</span>
    <span class="hljs-built_in">String</span> ak_id = <span class="hljs-string">"********"</span>; <span class="hljs-comment">//用戶ak</span>
    <span class="hljs-built_in">String</span> ak_secret = <span class="hljs-string">"********"</span>; <span class="hljs-comment">// 用戶ak_secret</span>
    <span class="hljs-built_in">String</span> url = <span class="hljs-string">"https://dtplus-cn-shanghai.data.aliyuncs.com/image/scene"</span>;
    <span class="hljs-built_in">String</span> body = <span class="hljs-string">"{\"type\": \"0\", \"image_url\":\"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&amp;quality=100&amp;size=b4000_4000&amp;sec=1544608444&amp;di=54513735567736d0eaeba7a13aa0421c&amp;src=http://img5q.duitang.com/uploads/item/201411/23/20141123205812_Bircn.jpeg\"}"</span>;
    System.out.println(<span class="hljs-string">"response body:"</span> + sendPost(url, body, ak_id, ak_secret));

}

}

使用本地圖片測試

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Encoder;
import javax.crypto.Mac;

public class ComputerDemo2 {

<span class="hljs-comment">/*
 * 計算MD5+BASE64
 */</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> MD5Base64(<span class="hljs-built_in">String</span> s) {
    <span class="hljs-keyword">if</span> (s == <span class="hljs-literal">null</span>)
        <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
    <span class="hljs-built_in">String</span> encodeStr = <span class="hljs-string">""</span>;
    byte[] utfBytes = s.getBytes();
    MessageDigest mdTemp;
    <span class="hljs-keyword">try</span> {
        mdTemp = MessageDigest.getInstance(<span class="hljs-string">"MD5"</span>);
        mdTemp.update(utfBytes);
        byte[] md5Bytes = mdTemp.digest();
        BASE64Encoder b64Encoder = <span class="hljs-keyword">new</span> BASE64Encoder();
        encodeStr = b64Encoder.encode(md5Bytes);
    } <span class="hljs-keyword">catch</span> (Exception e) {
        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Failed to generate MD5 : "</span> + e.getMessage());
    }
    <span class="hljs-keyword">return</span> encodeStr;
}
<span class="hljs-comment">/*
 * 計算 HMAC-SHA1
 */</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> HMACSha1(<span class="hljs-built_in">String</span> data, <span class="hljs-built_in">String</span> key) {
    <span class="hljs-built_in">String</span> result;
    <span class="hljs-keyword">try</span> {
        SecretKeySpec signingKey = <span class="hljs-keyword">new</span> SecretKeySpec(key.getBytes(), <span class="hljs-string">"HmacSHA1"</span>);
        Mac mac = Mac.getInstance(<span class="hljs-string">"HmacSHA1"</span>);
        mac.init(signingKey);
        byte[] rawHmac = mac.doFinal(data.getBytes());
        result = (<span class="hljs-keyword">new</span> BASE64Encoder()).encode(rawHmac);
    } <span class="hljs-keyword">catch</span> (Exception e) {
        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Failed to generate HMAC : "</span> + e.getMessage());
    }
    <span class="hljs-keyword">return</span> result;
}
<span class="hljs-comment">/*
 * 等同於javaScript中的 new Date().toUTCString();
 */</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> toGMTString(<span class="hljs-built_in">Date</span> date) {
    SimpleDateFormat df = <span class="hljs-keyword">new</span> SimpleDateFormat(<span class="hljs-string">"E, dd MMM yyyy HH:mm:ss z"</span>, Locale.UK);
    df.setTimeZone(<span class="hljs-keyword">new</span> java.util.SimpleTimeZone(<span class="hljs-number">0</span>, <span class="hljs-string">"GMT"</span>));
    <span class="hljs-keyword">return</span> df.format(date);
}
<span class="hljs-comment">/*
 * 發送POST請求
 */</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> sendPost(<span class="hljs-built_in">String</span> url, <span class="hljs-built_in">String</span> body, <span class="hljs-built_in">String</span> ak_id, <span class="hljs-built_in">String</span> ak_secret) throws Exception {
    PrintWriter out = <span class="hljs-literal">null</span>;
    BufferedReader <span class="hljs-keyword">in</span> = <span class="hljs-literal">null</span>;
    <span class="hljs-built_in">String</span> result = <span class="hljs-string">""</span>;
    int statusCode = <span class="hljs-number">200</span>;
    <span class="hljs-keyword">try</span> {
        URL realUrl = <span class="hljs-keyword">new</span> URL(url);
        <span class="hljs-comment">/*
         * http header 參數
         */</span>
        <span class="hljs-built_in">String</span> method = <span class="hljs-string">"POST"</span>;
        <span class="hljs-built_in">String</span> accept = <span class="hljs-string">"application/json"</span>;
        <span class="hljs-built_in">String</span> content_type = <span class="hljs-string">"application/json"</span>;
        <span class="hljs-built_in">String</span> path = realUrl.getFile();
        <span class="hljs-built_in">String</span> date = toGMTString(<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>());
        <span class="hljs-comment">// 1.對body做MD5+BASE64加密</span>
        <span class="hljs-built_in">String</span> bodyMd5 = MD5Base64(body);
        <span class="hljs-built_in">String</span> stringToSign = method + <span class="hljs-string">"\n"</span> + accept + <span class="hljs-string">"\n"</span> + bodyMd5 + <span class="hljs-string">"\n"</span> + content_type + <span class="hljs-string">"\n"</span> + date + <span class="hljs-string">"\n"</span>
                + path;
        <span class="hljs-comment">// 2.計算 HMAC-SHA1</span>
        <span class="hljs-built_in">String</span> signature = HMACSha1(stringToSign, ak_secret);
        <span class="hljs-comment">// 3.得到 authorization header</span>
        <span class="hljs-built_in">String</span> authHeader = <span class="hljs-string">"Dataplus "</span> + ak_id + <span class="hljs-string">":"</span> + signature;
        <span class="hljs-comment">// 打開和URL之間的連接</span>
        URLConnection conn = realUrl.openConnection();
        <span class="hljs-comment">// 設置通用的請求屬性</span>
        conn.setRequestProperty(<span class="hljs-string">"accept"</span>, accept);
        conn.setRequestProperty(<span class="hljs-string">"content-type"</span>, content_type);
        conn.setRequestProperty(<span class="hljs-string">"date"</span>, date);
        conn.setRequestProperty(<span class="hljs-string">"Authorization"</span>, authHeader);
        <span class="hljs-comment">// 發送POST請求必須設置如下兩行</span>
        conn.setDoOutput(<span class="hljs-literal">true</span>);
        conn.setDoInput(<span class="hljs-literal">true</span>);
        <span class="hljs-comment">// 獲取URLConnection對象對應的輸出流</span>
        out = <span class="hljs-keyword">new</span> PrintWriter(conn.getOutputStream());
        <span class="hljs-comment">// 發送請求參數</span>
        out.print(body);
        <span class="hljs-comment">// flush輸出流的緩衝</span>
        out.flush();
        <span class="hljs-comment">// 定義BufferedReader輸入流來讀取URL的響應</span>
        statusCode = ((HttpURLConnection)conn).getResponseCode();
        <span class="hljs-keyword">if</span>(statusCode != <span class="hljs-number">200</span>) {
            <span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(((HttpURLConnection)conn).getErrorStream()));
        } <span class="hljs-keyword">else</span> {
            <span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(conn.getInputStream()));
        }
        <span class="hljs-built_in">String</span> line;
        <span class="hljs-keyword">while</span> ((line = <span class="hljs-keyword">in</span>.readLine()) != <span class="hljs-literal">null</span>) {
            result += line;
        }
    } <span class="hljs-keyword">catch</span> (Exception e) {
        e.printStackTrace();
    } <span class="hljs-keyword">finally</span> {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">if</span> (out != <span class="hljs-literal">null</span>) {
                out.close();
            }
            <span class="hljs-keyword">if</span> (<span class="hljs-keyword">in</span> != <span class="hljs-literal">null</span>) {
                <span class="hljs-keyword">in</span>.close();
            }
        } <span class="hljs-keyword">catch</span> (IOException ex) {
            ex.printStackTrace();
        }
    }
    <span class="hljs-keyword">if</span> (statusCode != <span class="hljs-number">200</span>) {
        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IOException(<span class="hljs-string">"\nHttp StatusCode: "</span>+ statusCode + <span class="hljs-string">"\nErrorMessage: "</span> + result);
    }
    <span class="hljs-keyword">return</span> result;
}
<span class="hljs-comment">/*
 * GET請求
 */</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> sendGet(<span class="hljs-built_in">String</span> url, <span class="hljs-built_in">String</span> ak_id, <span class="hljs-built_in">String</span> ak_secret) throws Exception {
    <span class="hljs-built_in">String</span> result = <span class="hljs-string">""</span>;
    BufferedReader <span class="hljs-keyword">in</span> = <span class="hljs-literal">null</span>;
    int statusCode = <span class="hljs-number">200</span>;
    <span class="hljs-keyword">try</span> {
        URL realUrl = <span class="hljs-keyword">new</span> URL(url);
        <span class="hljs-comment">/*
         * http header 參數
         */</span>
        <span class="hljs-built_in">String</span> method = <span class="hljs-string">"GET"</span>;
        <span class="hljs-built_in">String</span> accept = <span class="hljs-string">"application/json"</span>;
        <span class="hljs-built_in">String</span> content_type = <span class="hljs-string">"application/json"</span>;
        <span class="hljs-built_in">String</span> path = realUrl.getFile();
        <span class="hljs-built_in">String</span> date = toGMTString(<span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>());
        <span class="hljs-comment">// 1.對body做MD5+BASE64加密</span>
        <span class="hljs-comment">// String bodyMd5 = MD5Base64(body);</span>
        <span class="hljs-built_in">String</span> stringToSign = method + <span class="hljs-string">"\n"</span> + accept + <span class="hljs-string">"\n"</span> + <span class="hljs-string">""</span> + <span class="hljs-string">"\n"</span> + content_type + <span class="hljs-string">"\n"</span> + date + <span class="hljs-string">"\n"</span> + path;
        <span class="hljs-comment">// 2.計算 HMAC-SHA1</span>
        <span class="hljs-built_in">String</span> signature = HMACSha1(stringToSign, ak_secret);
        <span class="hljs-comment">// 3.得到 authorization header</span>
        <span class="hljs-built_in">String</span> authHeader = <span class="hljs-string">"Dataplus "</span> + ak_id + <span class="hljs-string">":"</span> + signature;
        <span class="hljs-comment">// 打開和URL之間的連接</span>
        URLConnection connection = realUrl.openConnection();
        <span class="hljs-comment">// 設置通用的請求屬性</span>
        connection.setRequestProperty(<span class="hljs-string">"accept"</span>, accept);
        connection.setRequestProperty(<span class="hljs-string">"content-type"</span>, content_type);
        connection.setRequestProperty(<span class="hljs-string">"date"</span>, date);
        connection.setRequestProperty(<span class="hljs-string">"Authorization"</span>, authHeader);
        connection.setRequestProperty(<span class="hljs-string">"Connection"</span>, <span class="hljs-string">"keep-alive"</span>);
        <span class="hljs-comment">// 建立實際的連接</span>
        connection.connect();
        <span class="hljs-comment">// 定義 BufferedReader輸入流來讀取URL的響應</span>
        statusCode = ((HttpURLConnection)connection).getResponseCode();
        <span class="hljs-keyword">if</span>(statusCode != <span class="hljs-number">200</span>) {
            <span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(((HttpURLConnection)connection).getErrorStream()));
        } <span class="hljs-keyword">else</span> {
            <span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(connection.getInputStream()));
        }
        <span class="hljs-built_in">String</span> line;
        <span class="hljs-keyword">while</span> ((line = <span class="hljs-keyword">in</span>.readLine()) != <span class="hljs-literal">null</span>) {
            result += line;
        }
    } <span class="hljs-keyword">catch</span> (Exception e) {
        e.printStackTrace();
    } <span class="hljs-keyword">finally</span> {
        <span class="hljs-keyword">try</span> {
            <span class="hljs-keyword">if</span> (<span class="hljs-keyword">in</span> != <span class="hljs-literal">null</span>) {
                <span class="hljs-keyword">in</span>.close();
            }
        } <span class="hljs-keyword">catch</span> (Exception e) {
            e.printStackTrace();
        }
    }
    <span class="hljs-keyword">if</span> (statusCode != <span class="hljs-number">200</span>) {
        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IOException(<span class="hljs-string">"\nHttp StatusCode: "</span>+ statusCode + <span class="hljs-string">"\nErrorMessage: "</span> + result);
    }
    <span class="hljs-keyword">return</span> result;
}
public <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> main(<span class="hljs-built_in">String</span>[] args) throws Exception {
    <span class="hljs-comment">// 發送POST請求示例</span>
    <span class="hljs-built_in">String</span> ak_id = <span class="hljs-string">"********"</span>; <span class="hljs-comment">//用戶ak</span>
    <span class="hljs-built_in">String</span> ak_secret = <span class="hljs-string">"********"</span>; <span class="hljs-comment">// 用戶ak_secret</span>
    <span class="hljs-built_in">String</span> url = <span class="hljs-string">"https://dtplus-cn-shanghai.data.aliyuncs.com/image/scene"</span>;
    <span class="hljs-comment">//上傳本地圖片</span>
    <span class="hljs-comment">// Request body</span>
    <span class="hljs-built_in">String</span> pic_path = <span class="hljs-string">"C:\\Users\\taro.yt\\Desktop\\timg.jpg"</span>;

    File picBase64 = <span class="hljs-keyword">new</span> File(pic_path);
    <span class="hljs-built_in">String</span> pic = encodeImageToBase64(picBase64);

    <span class="hljs-comment">//提出base64編碼的換行符問題</span>
    <span class="hljs-built_in">String</span> data = pic.replaceAll(<span class="hljs-string">"[\\s*\t\n\r]"</span>, <span class="hljs-string">""</span>);
    data = <span class="hljs-string">"'"</span> + data + <span class="hljs-string">"'"</span>;

    <span class="hljs-built_in">String</span> body = <span class="hljs-string">"{\"type\": \"1\", \"content\":"</span>+data+<span class="hljs-string">"}"</span>;

    System.out.println(<span class="hljs-string">"response body:"</span> + sendPost(url, body, ak_id, ak_secret));
}

<span class="hljs-comment">/**
 * 將本地圖片編碼為base64
 *
 * @param file
 * @return
 * @throws Exception
 */</span>
public <span class="hljs-keyword">static</span> <span class="hljs-built_in">String</span> encodeImageToBase64(File file) throws Exception {
    <span class="hljs-comment">//將圖片文件轉化為字節數組字符串,並對其進行Base64編碼處理</span>

// loggerger.info("圖片的路徑為:" + file.getAbsolutePath());

    InputStream <span class="hljs-keyword">in</span> = <span class="hljs-literal">null</span>;
    byte[] data = <span class="hljs-literal">null</span>;
    <span class="hljs-comment">//讀取圖片字節數組</span>
    <span class="hljs-keyword">try</span> {
        <span class="hljs-keyword">in</span> = <span class="hljs-keyword">new</span> FileInputStream(file);
        data = <span class="hljs-keyword">new</span> byte[<span class="hljs-keyword">in</span>.available()];
        <span class="hljs-keyword">in</span>.read(data);
        <span class="hljs-keyword">in</span>.close();
    } <span class="hljs-keyword">catch</span> (IOException e) {
        e.printStackTrace();
        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Exception(<span class="hljs-string">"圖片上傳失敗,請聯繫客服!"</span>);
    }
    <span class="hljs-comment">//對字節數組Base64編碼</span>
    BASE64Encoder encoder = <span class="hljs-keyword">new</span> BASE64Encoder();
    <span class="hljs-built_in">String</span> base64 = encoder.encode(data);
    <span class="hljs-keyword">return</span> base64;<span class="hljs-comment">//返回Base64編碼過的字節數組字符串</span>
}

}

測試結果

response body:{"tags":[{"value":"人物","confidence":97.0},{"value":"演出","confidence":12.0},{"value":"其他","confidence":12.0},{"value":"室內","confidence":11.0}],"errno":0,"request_id":"b31aebed-305a-4377-a843-ac4e9d3d30c1"}

參考鏈接

場景識別API調用說明

Leave a Reply

Your email address will not be published. Required fields are marked *