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(){ @Override public void run() { //获得七牛上传凭证uploadToken String 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() { @Override public void complete(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 */ <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,说明上传成功。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。