android開發之上傳圖片到七牛雲端儲存體服務器
相信很多開發人員會把圖片存放到七牛上,我的web網站也是吧圖片儲存到七牛上,對於以圖片為主的網站,這樣可以節省很大頻寬。
將圖片上傳到七牛伺服器的重點就是獲得上傳憑證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-http-1.4.6並匯入項目
第三、android上傳圖片
由於Android4.0 以後不允許在主線程進行網路連接,所以需要新開個線程來擷取上傳憑證。
/* * 上傳圖片到七牛 */private void uploadImg(){new Thread(new Runnable(){@Overridepublic void run() {//獲得七牛上傳憑證uploadTokenString token=getUploadToken();//手機SD卡圖片存放路徑String imgPath="";try {imgPath=FileUtil.getBasePath()+ "/test.jpg";} catch (IOException e) {e.printStackTrace();}if(token!=null){String data = imgPath;//圖片名稱為當前日期+隨機數產生String key = getRandomFileName();UploadManager uploadManager = new UploadManager();uploadManager.put(data, key, token,new UpCompletionHandler() {@Overridepublic void complete(String arg0, ResponseInfo info, JSONObject response) {// TODO Auto-generated method stubLog.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,說明上傳成功。