@big-bear
2016-12-14T10:43:34.000000Z
字数 7802
阅读 2258
服务器
七牛云存储是一家数据管理平台,专门为互联网网站和移动App提供数据的在线托管、传输加速以及图片、音视频等富媒体的云处理服务。
Access Key 与 Secret Key 是七牛颁发的一对密钥,用于对操作请求进行授权签名.类似于用户名和密码,七牛通过这两个字段来确保用户的唯一性,每个账号完成申请后都可以在七牛网站里找到.
资源与key(键名)
- 资源作为七牛云存储服务中基础的逻辑存储的单元(可以理解为文件).
- 键名key可以理解为资源的文件名,在同一个bucket中每个资源的key是唯一的.
- 在七牛云中没有文件夹的概念,所以可以用key来区分目录的层次结构,比如"wisdomhr/web/src/webapp/index.html".
- 七牛云支持key中加入"/",".","-"等字符,用户的角度看没有文件拓展名的.
bucket(空间)和domain(域名)
- 资源的组织管理单位,一个资源必须存放在一个空间里.
- bucket+key可以确定一个资源的唯一性.
- 每个bucket会对应一个唯一的domain(域名),在下载的时候通过域名来访问相应的bucket
- 每个bucket作为上传和下载的基础,即上传或者下载资源都是指定到bucket(或者bucket对应的domain).
- 用户可以对每个bucket进行不同的配置,包括访问权限、数据处理、域名设置等。
- bucket分为公有空间与私有空间。下载的时候公有空间里的资源可以通过url直接下载,但是私用空间的必须在URL上带上一个token作为下载凭证
- 一个账号默认情况下可以拥有20个空间.
在上传和下载过程中,开发者或者用户需要生成一个token,这个token会作为请求内容的一部分,如果不带凭证或者带非法凭证就是现实认证失败,无法完成相关的操作.
maven引入七牛SDK的jar包:
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.0.0, 7.0.99]</version>
</dependency>
public static final String QINIU_ACCESS_KEY = "sdPLhMYbhzwHYrwFaLL4C--Af9s_D4EdpambxYXc";
public static final String QINIU_SECRET_KEY = "YHLh47oVdi4k7smL83WHtCzbFUfz80jQrNBK9BRq";
//AccessKey与SecretKey来确定了账号的唯一性
public static final String QINIU_DOMAIN_PRIVATE = "http://7xsnwy.com2.z0.glb.qiniucdn.com";
public static final String QINIU_BUCKET_PRIVATE = "wisdomhr-pc";
//每个Bucket都会对应一个Domain
public static final String QINIU_DOMAIN_PUBLIC = "http://7xso5g.com2.z0.glb.qiniucdn.com";
public static final String QINIU_BUCKET_PUBLIC = "wisdomhr-pc-public";
public class UploadDemo {
// 设置好账号的ACCESS_KEY和SECRET_KEY
String ACCESS_KEY = Constants.QINIU_ACCESS_KEY;
String SECRET_KEY = Constants.QINIU_SECRET_KEY;
// 要上传的空间
String bucketName = "bigbear";
// 上传到七牛后保存的文件名
String key = "test/bigbear.jpg";
// 上传文件的路径
String FilePath = "E:\\40.jpg";
// 密钥配置
Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
// 创建上传对象
UploadManager uploadManager = new UploadManager();
public String getUpToken() {
return auth.uploadToken(bucketName,3600);//3600为token的有效时间,单位ms;在这里只设置bucketName的话,可以上传任意名称的资源,但是如果资源的key重复了的话会上传失败
//return auto.uploadToken(bucketName,key,3600);如果设置了bucketName和key两个参数的话,必须上传资源的key就固定了,这样如果七牛云上没有相同key名的话就会创建一个,如果有相同key的资源的话会覆盖掉七牛云上原有的文件.
// return auth.uploadToken(bucketname, key, 3600, new StringMap().put("insertOnly", 1 ));//如果同时设置了insertOnly,上传以后这个文件不会允许修改,也不会发生覆盖.
}
public void upload() throws IOException {
try {
// 调用put方法上传
Response res = uploadManager.put(FilePath, key, getUpToken());
// 打印返回的信息
System.out.println(res.bodyString());
} catch (QiniuException e) {
Response r = e.response;
// 请求失败时打印的异常的信息
System.out.println(r.toString());
try {
// 响应的文本信息
System.out.println(r.bodyString());
} catch (QiniuException e1) {
// ignore
}
}
}
public static void main(String args[]) throws IOException {
new UploadDemo().upload();
}
public class DownloadDemo {
// 设置好账号的ACCESS_KEY和SECRET_KEY
String ACCESS_KEY = Constants.QINIU_ACCESS_KEY;
String SECRET_KEY = Constants.QINIU_SECRET_KEY;
// 密钥配置
Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
// 构造私有空间的需要生成的下载的链接
String URL = Constants.QINIU_DOMAIN_PRIVATE + "/test/bigbear.jpg";
public void download() {
// 调用privateDownloadUrl方法生成下载链接,第二个参数可以设置Token的过期时间
String downloadRUL = auth.privateDownloadUrl(URL, 3600);
}
public static void main(String args[]) {
new DownloadDemo().download();
}
}
这是一个覆盖上传的demo
namespace ConsoleDemo
{
class UploadDemo
{
private void upload()
{
//设置账号的AK和SK
Qiniu.Conf.Config.ACCESS_KEY = "Access_Key";
Qiniu.Conf.Config.SECRET_KEY = "Secret_Key";
IOClient target = new IOClient();
PutExtra extra = new PutExtra();
//设置上传的空间
String bucket = "bucket_name";
//设置上传的文件的key值
String key = "yourdefinekey";
//覆盖上传,<bucket>:<key>,表示只允许用户上传指定key的文件。在这种格式下文件默认允许“修改”,已存在同名资源则会被本次覆盖。
PutPolicy put = new PutPolicy(bucket+":"+key, 3600);
//设置callbackUrl以及callbackBody,七牛将文件名和文件大小回调给业务服务器
put.CallBackUrl = "http://your.domain.com/callback";
put.CallBackBody = "filename=$(fname)&filesize=$(fsize)";
//调用Token()方法生成上传的Token
string upToken = put.Token();
//上传文件的路径
String filePath = "/.../...";
//调用PutFile()方法上传
PutRet ret = target.PutFile(upToken, key, filePath, extra);
//打印出相应的信息
Console.WriteLine(ret.Response.ToString());
Console.WriteLine(ret.key);
Console.ReadLine();
}
static void Main(string[] args)
{
//实例化UploadDemo对象并调用设置的upload方法
UploadDemo Upload = new UploadDemo();
Upload.upload();
}
}
}
下载的demo
namespace ConsoleDemo
{
class Download
{
public static void download()
{
//设置需要操作的账号的AK和SK
Qiniu.Conf.Config.ACCESS_KEY = "Access_Key";
Qiniu.Conf.Config.SECRET_KEY = "Secret_Key";
//构造私有空间的需要生成的下载的链接
string baseUrl = "http://bucketdomain/key";
//调用MakeRequest方法生成私有下载链接
string private_url = GetPolicy.MakeRequest(baseUrl);
Console.WriteLine(private_url);
Console.ReadLine();
}
static void Main(string[] args)
{
Download.download();
}
}
}
plupload.full.min.js,qiniu.js
七牛SDK依赖于plupload.full.min.js
js
define([
'jquery',
'bootstrap',
'plupload',
'zh_CN',
'qiniuUi',
'qiniu',
'highlight',
'wutil'
],
function($,bootstrap,plupload,zh_CN,qiniu,qiniuUi,highlight,wutil) {
var utils={
domain:'http://7xrfjz.com1.z0.glb.clouddn.com',
// domain:'http://7xsnwy.com2.z0.glb.qiniucdn.com',
//上传图片
// options{
// uploadNum:2 //涉及到一个页面多个上传空间的时候,输入上传位置的序号
// browse_button:'upload',//上传选择的点选按钮,**必需**
// uptoken_url:'xxx/xxx?xx=xxx',//获取上传的token的url
// FileUploaded:function(up, file, info){ // 每个文件上传成功后,处理相关的事情
// var sourceLink = domain + res.key; //获取上传成功后的文件的Url
// },
// 'BeforeUpload': function(up, file) {
// // 每个文件上传前,处理相关的事情
// },
// 'UploadProgress': function(up, file) {
// // 每个文件上传时,处理相关的事情
// },
// 'Error': function(up, err, errTip) {
// //上传出错时,处理相关的事情
// },
// 'UploadComplete': function() {
// //队列文件处理完毕后,处理相关的事情
// },
// 'Key': function(up, file) {
// // 若想在前端对每个文件的key进行个性化处理,可以配置该函数
// var key = "";
// // do something with key here
// return key
// }
// }
qiniuUploadPic:function(options){
/*调用七牛的JS-sdk,部分参数已经忽略,有疑问的话可以查询:https://github.com/qiniu/js-sdk/*/
var qiniuOptions={
runtimes: 'html5,flash,html4',
browse_button: options.browse_button,//必填
max_file_size: '5mb',
dragdrop: false,//是否拖拽上传
// drop_element: 'container',//否
//chunk_size: '4mb',//分块上传每块的体积
// container:'container',
uptoken_url:options.uptoken_url,
domain: this.domain,
get_new_uptoken: false,
downtoken_url: options.downtoken_url,
//'/api/v1/qiniu/download-url?fileName=attached/student',
auto_start: true,//选择文件后自动上传
log_level: 5,
init: {
'FilesAdded': function(up, files) {
},
'BeforeUpload':options.BeforeUpload,
'UploadProgress':options.UploadProgress,
'UploadComplete': options.UploadComplete,
'FileUploaded': options.FileUploaded,
'Error':options.Error,
'Key':options.Key
}
}
var QiniuArray = new Array();
var uploaderArray=new Array();
if(options.uploadNum){
QiniuArray[options.uploadNum]=new QiniuJsSDK();
uploaderArray[options.uploadNum]=QiniuArray[options.uploadNum].uploader(qiniuOptions);
}else {
var uploader = Qiniu.uploader(qiniuOptions);//加载页面的时候会初始化这个函数,,当点击上传ID绑定的按钮的时候就会触发上传事件.
}
},
}
};//end utils
return utils;
});
html页面
html
<div class="upload-file-wrap">
<input name="isQiniuLogo" type="hidden" value="{{isQiniuLogo}}">
<input name="portrait" type="hidden" value="{{portrait}}">
<input type="hidden" name="localLogoPath" value="" disabled>
<!-- <a class="hidden" data-purpose="upload"></a> -->
<input id="logoUpload" name="upload" title="支持jpg、jpeg、gif、png格式,文件小于10M" type="file">
</div>