android开发以上传图片到七牛云存储服务器

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,说明上传成功。

android开发以上传图片到七牛云存储服务器