android開發之上傳圖片到七牛雲端儲存體服務器,
相信很多開發人員會把圖片存放到七牛上,我的web網站也是吧圖片儲存到七牛上,對於以圖片為主的網站,這樣可以節省很大頻寬。
將圖片上傳到七牛伺服器的重點就是獲得上傳憑證uploadToken,直接把AccessKey和Secret放到用戶端太不安全,容易被反編譯。所以需要在伺服器端根據AccessKey和Secret動態產生一個uploadToken,然後傳回到用戶端,用戶端通過這個uploadToken將圖片上傳到七牛伺服器。
第一、在伺服器端產生uploadToken
//將圖片上傳到七牛 start$bucket='七牛空間名稱';$expires = 3600;$accessKey='去七牛查看';$secretKey=<span style="font-family: Arial, Helvetica, sans-serif;">'去七牛查看';</span>$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)是自己封裝的用於產生上傳憑證的函數
<pre name="code" class="html"><span style="white-space:pre"></span>public function uploadToken($flags)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>if(!isset($flags['deadline']))<span style="white-space:pre"></span>$flags['deadline'] = 3600 + time();<span style="white-space:pre"></span>$encodedFlags = self::urlsafe_base64_encode(json_encode($flags));<span style="white-space:pre"></span>$sign = hash_hmac('sha1', $encodedFlags, $this->secretKey, true);<span style="white-space:pre"></span>$encodedSign = self::urlsafe_base64_encode($sign);<span style="white-space:pre"></span> <span style="white-space:pre"></span>$token = $this->accessKey.':'.$encodedSign. ':' . $encodedFlags;<span style="white-space:pre"></span> <span style="white-space:pre"></span>return $token;<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>public static function urlsafe_base64_encode($str){<span style="white-space:pre"></span> $find = array("+","/");<span style="white-space:pre"></span> $replace = array("-", "_");<span style="white-space:pre"></span> return str_replace($find, $replace, base64_encode($str));<span style="white-space:pre"></span>}
第二、下載qiniu-android-sdk-7.0.0.jar和android-async-http-1.4.6並匯入項目
第三、android上傳圖片
由於Android4.0 以後不允許在主線程進行網路連接,所以需要新開個線程來擷取上傳憑證。
<span style="white-space:pre"></span>/* * 上傳圖片到七牛 */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 */<span style="white-space:pre"></span>private String getUploadToken()<span style="white-space:pre"></span>{<span style="white-space:pre"></span> HttpClient client = new DefaultHttpClient();<span style="white-space:pre"></span> StringBuilder builder = new StringBuilder();<span style="white-space:pre"></span> <span style="white-space:pre"></span> HttpGet myget = new HttpGet("http://10.0.0.2/test/getUploadToken.php");<span style="white-space:pre"></span> try {<span style="white-space:pre"></span> HttpResponse response = client.execute(myget);<span style="white-space:pre"></span> BufferedReader reader = new BufferedReader(new InputStreamReader(<span style="white-space:pre"></span> response.getEntity().getContent()));<span style="white-space:pre"></span> for (String s = reader.readLine(); s != null; s = reader.readLine()) {<span style="white-space:pre"></span> builder.append(s);<span style="white-space:pre"></span> }<span style="white-space:pre"></span> return builder.toString();<span style="white-space:pre"></span> } catch (Exception e) {<span style="white-space:pre"></span> Log.i("url response", "false");<span style="white-space:pre"></span> e.printStackTrace();<span style="white-space:pre"></span> return null;<span style="white-space:pre"></span> }<span style="white-space:pre"></span>}
通過LOG日誌可以看到Qiniu--success,說明上傳成功。