android開發之上傳圖片到七牛雲端儲存體服務器,

來源:互聯網
上載者:User

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,說明上傳成功。





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.