七牛云存储的简单使用总结_7牛 s3存储的使用-程序员宅基地

技术标签: JAVA  七牛  

七牛是专注文件存储的第三方服务商,服务较好。自己最近做到服务器存储图片的时候就想到用七牛来做,将图片或者文件存放在七牛,然后自己服务器只存放资源存放在七牛文件的url。


今天主要分享两个内容:凭证的获取,安卓上传文件


在做之前还是先把官方文档好好读几遍比较好


首先说说凭证,七牛对所有上传的资源都需要身份验证,就是通过凭证来验证,验证通

过,那么就可以成功上传文件,不通过,七牛服务器会反馈一个上传失败的原因。


凭证相关概念


凭证一般不由客户端颁发,而是由业务服务器产生,分发给客户端,起到安全的保护机

制。具体可以参考七牛的编程模型


编程模型



构造上传凭证需要先构造出上传策略,上传策略是资源上传时附带的一组配置设定。通

过这组配置信息,七牛云存储可以了解用户上传的需求:它将上传什么资源,上传到哪

个空间,上传结果是回调通知还是使用重定向跳转,是否需要设置反馈信息的内容,以

及授权上传的截止时间等等。



在上传策略里可以指定上传完成后的动作,比如是给web客户端一个请求重定向

returnurl并附带retunbody,还是在客户端上传完后七牛给业务服务器一个回调,在

callbackurl可以指定回掉的url,在callbackbody可以指定回掉给业务服务器的内容。服

务器收到回调后还要给七牛一个回调,回调必须设置为json格式,七牛会直接把这个回

调发给客户端。


构造上传凭证的上传策略


接下来就可以构造上传凭证了,在这儿因为上传凭证是应该在服务器产生的,所以这儿

参考java(服务器)sdk开发文档

java服务器SDK开发指南文档


在文档里详细介绍如何生成token(凭证),其中生成凭证有几个参数必填,第一个

bucket,即自己创建的上传空间,第二个指定上传资源的名字,必须要唯一化,如果这

里指定了key,那么在客户端比如安卓上传时候也要指明同一个key,否则上传失败,当

然如果需要上传多张图片时候,那么最好在生成token的时候不指定key,那么在安卓端

(客户端)上传时候是可以指定key的(即生成token时候不指定key,在安卓端上传时

候可以指定),这时候指定了key,这个key就是上传的文件的名称,最好不要用中文命

名。


生成好token后就可以用token去上传数据了,这里采用的是安卓端,网页也试过,差不

安卓上传没什么难度,参考安卓上传SDK开发文档

<span style="font-family:KaiTi_GB2312;"><span style="font-size:24px;">// 重用 uploadManager。一般地,只需要创建一个 uploadManager 对象
UploadManager uploadManager = new UploadManager();
data = <File对象、或 文件路径、或 字节数组>
String key = <指定七牛服务上的文件名,或 null>;
String token = <从服务端SDK获取>;
uploadManager.put(data, key, token,
new UpCompletionHandler() {
    @Override
    public void complete(String key, ResponseInfo info, JSONObject res) {
        //  res 包含hash、key等信息,具体字段取决于上传策略的设置。 
        Log.i("qiniu", key + ",\r\n " + info + ",\r\n " + res);
    }
}, null);</span></span>

其中key指定上传文件的名称,第三个参数为七牛反馈的回调,在jsonobject里面反馈的

数据都是在上传策略里面指定的类型。其他的断点上传,分片上传,上传进度获取在开

发文档都有了。


最后总结一些问题:

在token里指定key,那么上传文件时也要指定相同的key,否则上传失败。如果在token

里可以不指定key,在上传时指定也没事,key即为bucket保存的文件名。


关于七牛包的依赖问题也是比较麻烦,安卓端注意sdk版本依赖问题。可以参考另一篇

博文:七牛关于sdk的依赖包问题

在上传数据失败,各种状态码解决方案请参考:七牛错误状态码解析

关于七牛回调请参考:七牛回调理解


具体 以后有什么使用感悟再更新,有什么问题欢迎指正,谢谢!微笑

给出生成token的代码(java版本)

</pre><pre name="code" class="java">package test;

import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;

public class TestQiniu {

	public static void main(String[] args) {
		String uptoken = getUptoken();
		System.out.println(uptoken);

	}

	private static String getUptoken() {
		Auth auth = Auth.create("AK",
				"SK");
		String uptoken = auth
				.uploadToken(
						"agriculturetest",
						null,
						3600,
						new StringMap()
								.putNotEmpty(
										"returnBody",
										"{\"key\": $(key), \"imageAve\": $(imageAve), \"width\": $(imageInfo.width), \"height\": $(imageInfo.height)}"));
		return uptoken;
	}

}


安卓端上传文件代码

package com.example.testqiniutoken;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.qiniu.android.http.ResponseInfo;
import com.qiniu.android.storage.UpCompletionHandler;
import com.qiniu.android.storage.UploadManager;

public class MainActivity extends Activity implements OnClickListener {
	private Button button;
	private static final String TAG = "MainActivity";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button = (Button) findViewById(R.id.button1);
		button.setOnClickListener(this);
	}


	
	public byte[] getBytes(InputStream is)  {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		byte[] b = new byte[2048];
		int len;
		try {
			while ((len = is.read(b, 0, 2048)) != -1) {
				baos.write(b, 0, len);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			baos.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return baos.toByteArray();
	}

	@Override
	public void onClick(View v) {
		try {
			
			InputStream is = getResources().getAssets().open(
					"146459-105.jpg");
			byte[] bytes = getBytes(is);
			UploadManager uploadManager = new UploadManager();
			//第二个参数就是指定在bucket里面存储文件的名字,唯一性
			uploadManager
					.put(bytes,
							"meinv",
				"8EqgYr4A18xyeUzWdDHt6OKTKJ5wW9mttLKiobF_:vMN2oe1OFKTkBHPv0TplIfTBjyw=:eyJzY29wZSI6ImFncmljdWx0dXJldGVzdCIsInJldHVybkJvZHkiOiJ7XCJrZXlcIjogJChrZXkpLCBcImltYWdlQXZlXCI6ICQoaW1hZ2VBdmUpLCBcIndpZHRoXCI6ICQoaW1hZ2VJbmZvLndpZHRoKSwgXCJoZWlnaHRcIjogJChpbWFnZUluZm8uaGVpZ2h0KX0iLCJkZWFkbGluZSI6MTQ1MjkzMzUxOX0=",
							new UpCompletionHandler() {
								@Override
								public void complete(String key,
										ResponseInfo info, JSONObject response) {
									Log.e(TAG, key);
									Log.e(TAG, info.toString());
									Log.e(TAG, "上传是否成功"+info.isOK());
									//上传失败的话response是null !!!!!!
									if (response!=null) {
										Log.e(TAG, response.toString());
										
									}
								}
							}, null);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}




版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/silence2015/article/details/50528438

智能推荐

查找恢复密钥_windows11恢复密钥官网-程序员宅基地

文章浏览阅读2.7w次。登陆自己的微软账号可查看恢复密钥,点击以下链接查找恢复密钥:https://account.microsoft.com/devices/recoverykey根据密钥ID,输入对应的恢复密钥。_windows11恢复密钥官网

计算机功能区各部分,Win8.1资源管理器窗口各部分名称是什么(适于Win8)?-程序员宅基地

文章浏览阅读2.1k次。Win8.1资源管理器窗口各部分名称是什么(适于Win8)?使用了Win8.1这么长时间,Win8.1的资源管理器的窗口,很多位置都不知道名称是什么,总感觉多少有些对不住微软,而且以后看高手介绍的相关内容,倘若使用这些窗口的专业名称,让人似懂不懂的,实在是让人汗颜,针对这个问题,笔者编辑了下面的内容,相信对您了解Win8或者Win8.1,资源管理器的窗口各部分的名称是有帮助的!还是以Win8.1为..._资源处理器窗口各名称

1、 赛灵思-Zynq UltraScale+ MPSoCs:产品简介_apu a53-程序员宅基地

文章浏览阅读6.1k次,点赞11次,收藏55次。1、 赛灵思-Zynq UltraScale+ MPSoCs:产品简介_apu a53

better-scroll切换栏吸顶效果_better scroll 吸顶-程序员宅基地

文章浏览阅读1.5k次。在better-scroll里使用position:sticky会无效,使用position:fixed定位会被better-scroll自身实现过程的tanslate给位移出去解决方法: 做两个切换栏,一个在better-scroll外,一个在内,当达到临界值时,通过v-if指令,让内部隐藏,外部显示,外部可以使用postion:fixed达到吸顶的效果代码示例:<template> <div class='home'> <NavBar title_better scroll 吸顶

阅读笔记:Exploiting High-Level Semantics for NR Image Quality Assessment of Realistic Blur Image_exploiting high-level semantics for no-reference i-程序员宅基地

文章浏览阅读3.5k次。摘要:针对这一问题,我们利用高级语义学,提出了一种新的对于真实模糊图像的无参考图像质量评价方法。1.将整个图像分成多个不重叠的补丁;2.每个补丁由从训练好的DCNN模型提取高级语义特征;3.采用三种不同的统计结构对来自不同的补丁信息进行统计,主要包含一切常见的统计方法;4聚集的特征作为线性回归模型的输入预测图像质量。1.提出的方法图像表示、特征提取、特征聚合和质量预测1.1图像表示预先训练的 dcnn 模型(例如 alexnet)需要一个固定的输入大小。为了满足这个要求,图像可以裁剪,._exploiting high-level semantics for no-reference image quality assessment of

新加入同学期待已久的YOLO V3-程序员宅基地

文章浏览阅读159次。欢迎关注“计算机视觉研究院”计算机视觉研究院专栏作者:Edison_G计算机视觉研究院长按扫描二维码关注我们好久不见各位研友(研究好友,不是考研的小伙伴,嘿嘿)!最近,因为博主事情比较繁..._yolov3 softmax loss logistic loss

随便推点

串口RS232的学习_232tx和rx-程序员宅基地

文章浏览阅读4.9k次,点赞4次,收藏42次。《FPGA Verilog开发实战指南——基于Altera EP4CE10》2021.7.10(上)串口RS232的学习_232tx和rx

2019年最新编程语言排行榜出炉TIOBE_2019 计算机语言排行榜-程序员宅基地

文章浏览阅读2.9w次,点赞7次,收藏12次。Python编程语言赢得了“年度编程语言”的称号!Python已经获得了这个称号,因为与其他所有语言相比,它在2018年获得了最多的排名。Python语言赢得了3.62%,其次是Visual Basic .NET和Java。Python现在已经成为大型编程语言的一部分。近20年来,C,C ++和Java一直位居前三,远远领先于其他公司。Python现在正在加入这三种语言。它是当今大学中最常用的第一..._2019 计算机语言排行榜

目标检测MMDetection_mmdetection 检测头-程序员宅基地

文章浏览阅读1.4k次。论文:MMDetection: Open MMLab Detection Toolbox and BenchmarkGithub:https://github.com/open-mmlab/mmdetection.git商汤和港中文开源的一个集成很多主流目标检测算法的检测框架,提供了超过200多个预训练模型。相比Facebook开源的Detectron框架,作者声称mmdetecti..._mmdetection 检测头

uos应用_UOS就是Deepin V20?-程序员宅基地

文章浏览阅读214次。Hello,小伙伴们打扎好。上期呢我发了个视频合集是关于Deepin V20的。当时下面我也提到自己在申请成为UOS的内测,不过一周过去了还没有消息。于是就去网上找了别的内测开发者放出来的内测系统镜像文件,来验证一下是不是UOS就是Deepin V20毕竟通过相关的媒体报道和视频对比来看真的 太相似了,一些old out自媒体直接把uos作为Deepin V20。不过本身其实也没有什么好意外的,毕..._deepin v20 uos

Dex-Net 2.0 论文翻译_deep learning a grasp function for grasping under -程序员宅基地

文章浏览阅读7.9k次,点赞3次,收藏32次。一、绪论1)本文的主要贡献 1、制作dex-net2.0数据集,该数据集包括670万点云数据,又从1500个 3D模型通过GWS(抓手运行空间分析)得到手爪的运行规划 2、设计Grasp Quality Convolutional Neural Network (GQ-CNN),去得到一系列鲁棒性良好的抓取规划 3、设置一种抓取机制,可以对得到的鲁棒性良好的一组抓取规划进行 rank排序,_deep learning a grasp function for grasping under gripper pose uncertainty

JJwt生成Token-程序员宅基地

文章浏览阅读646次。JJwt生成tokenjava中通过jjwt生成tokenpackage com.zom.statistics.tools;import com.zom.statistics.DTO.JwtParams;import com.zom.statistics.DTO.RtvConsoleUser;import com.zom.statistics.exception.LogonException;import io.jsonwebtoken.*;import org.slf4j.Logger_jjwt生成token

推荐文章

热门文章

相关标签