將圖片上傳到七牛服務器的重點就是獲得上傳憑證uploadToken,直接把AccessKey和Secret放到客戶端太不安全,容易被反編譯。所以需要在服務器端根據AccessKey和Secret動態生成壹個uploadToken,然後傳回到客戶端,客戶端通過這個uploadToken將圖片上傳到七牛服務器。
第壹、在服務器端生成uploadToken
//將圖片上傳到七牛 start
$bucket='七牛空間名稱';
$expires = 3600;
$accessKey='去七牛查看';
$secretKey='去七牛查看';
$client = new QiniuClient($accessKey,$secretKey);
$flags = array();
$scope = $bucket;
$deadline = time() + $expires;
$flags['scope'] = $scope;
$flags['deadline'] = $deadline;
$flags['returnBody'] = null;
echo $client->uploadToken($flags);
這裏註意壹下bucket:七牛空間名稱和deadline:uploadToken失效時間,具體可查看壹下官網上傳憑證介紹
uploadToken($flags)是自己封裝的用於生成上傳憑證的函數
public function uploadToken($flags) { if(!isset($flags['deadline'])) $flags['deadline'] = 3600 + time(); $encodedFlags = self::urlsafe_base64_encode(json_encode($flags)); $sign = hash_hmac('sha1', $encodedFlags, $this->secretKey, true); $encodedSign = self::urlsafe_base64_encode($sign); $token = $this->accessKey.':'.$encodedSign. ':' . $encodedFlags; return $token; }
public static function urlsafe_base64_encode($str){
$find = array("+","/");
$replace = array("-", "_");
return str_replace($find, $replace, base64_encode($str));
}
第二、下載qiniu-android-sdk-7.0.0.jar和android-async-plete(String arg0, ResponseInfo info, JSONObject response) {
// TODO Auto-generated method stub
Log.i("qiniu", info.toString());
}
}, null);
}
else{
Log.i("fail", "上傳失敗");
}
}
}).start();
}
FileUtil.getBasePath()使用來獲取SD卡基本路徑,getRandomFileName()生成壹個隨機數來命名上傳圖片,具體方法我在這就不寫了。
獲得上傳憑證的方法也很簡單,直接使用httpget和服務器通信,獲得第壹步中生成的數據即可。(註意10.0.2.2是模擬器提供的特殊IP,等同於在電腦端的環回測試IP127.0.0.1)
/*
* 獲得七牛上傳憑證uploadtoken
*/
private String getUploadToken()
{
HttpClient client = new DefaultHttpClient();
StringBuilder builder = new StringBuilder();
HttpGet myget = new HttpGet("http://10.0.0.2/test/getUploadToken.php");
try {
HttpResponse response = client.execute(myget);
BufferedReader reader = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
for (String s = reader.readLine(); s != null; s = reader.readLine()) {
builder.append(s);
}
return builder.toString();
} catch (Exception e) {
Log.i("url response", "false");
e.printStackTrace();
return null;
}
}
通過LOG日誌可以看到Qiniu--success,說明上傳成功。