[关闭]
@big-bear 2016-12-14T10:43:34.000000Z 字数 7802 阅读 2258

七牛云文件托管

服务器


什么是七牛

七牛云存储是一家数据管理平台,专门为互联网网站和移动App提供数据的在线托管、传输加速以及图片、音视频等富媒体的云处理服务。

什么时候考虑使用七牛云托管

为什么使用七牛云

  1. 存储:可以存储静态文件,包含:图片,音视频,甚至是 CSS,JS,还可以存储其他文件和非结构化数据。
  2. 云处理:这是个人认为七牛最强地方,就是支持图片、音频、视频等资源在线压缩和转换处理,并且可以通过回调功能自定义数据处理。
  3. 云加速:七牛支持上传/下载双向加速,并且单文件上传无大小限制,支持断点续传。分布各地的加速节点,自动选择离用户最近的节点,保证数据上传下载的速度
  4. API 操作:七牛云存储提供了一系列 API 和 SDK 和示例教程教你接入使用。
  5. 缩略图:七牛支持设置不同大小规格的图片,而且是可以自定义尺寸的,根据用户的显示分辨率不同使用不同的图片,达到下载速度和显示体验的最佳搭配,而七牛的缩略图定义非常方便,只需要在七牛的后台 Web 界面进行进行定义即可。
  6. 支持域名绑定:只要你的域名已经通过备案,就可以使用子域名绑定你的存储空间,通过二级域名访问你的静态资源(详细过程我会在文章后面介绍)。
  7. CDN镜像存储:七牛云存储相比 Amazon S3、又拍云存储等服务,他还支持传统 CDN 的镜像存储,有了这个功能,就无需将原来的图片上传到七牛的服务器上,只需要在你的网站上面进行一些处理,就可以搞定静态网站的静态文件加速!(其原理就 是当云存储中不存在请求的文件时,云存储会到你指定的域名下寻找,并存储到云存储中。这样可以显著降低网站迁移成本,也免去了开发各程序相应插件的繁琐。 只要你的资源文件使用独立域名,就可以非常简单地把资源文件迁移到七牛。)
    原文的连接七牛的好处

怎样使用七牛云

七牛云基本概念



七牛概念图

上传与下载过程简单介绍

上传过程示例图

本地文件的上传和下载的简单实现

1. 引入七牛SDK

maven引入七牛SDK的jar包:

  1. <dependency>
  2. <groupId>com.qiniu</groupId>
  3. <artifactId>qiniu-java-sdk</artifactId>
  4. <version>[7.0.0, 7.0.99]</version>
  5. </dependency>

2. 七牛相关常量的配置:

  1. public static final String QINIU_ACCESS_KEY = "sdPLhMYbhzwHYrwFaLL4C--Af9s_D4EdpambxYXc";
  2. public static final String QINIU_SECRET_KEY = "YHLh47oVdi4k7smL83WHtCzbFUfz80jQrNBK9BRq";
  3. //AccessKey与SecretKey来确定了账号的唯一性
  4. public static final String QINIU_DOMAIN_PRIVATE = "http://7xsnwy.com2.z0.glb.qiniucdn.com";
  5. public static final String QINIU_BUCKET_PRIVATE = "wisdomhr-pc";
  6. //每个Bucket都会对应一个Domain
  7. public static final String QINIU_DOMAIN_PUBLIC = "http://7xso5g.com2.z0.glb.qiniucdn.com";
  8. public static final String QINIU_BUCKET_PUBLIC = "wisdomhr-pc-public";

3. 上传的简单demo

  1. public class UploadDemo {
  2. // 设置好账号的ACCESS_KEY和SECRET_KEY
  3. String ACCESS_KEY = Constants.QINIU_ACCESS_KEY;
  4. String SECRET_KEY = Constants.QINIU_SECRET_KEY;
  5. // 要上传的空间
  6. String bucketName = "bigbear";
  7. // 上传到七牛后保存的文件名
  8. String key = "test/bigbear.jpg";
  9. // 上传文件的路径
  10. String FilePath = "E:\\40.jpg";
  11. // 密钥配置
  12. Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
  13. // 创建上传对象
  14. UploadManager uploadManager = new UploadManager();
  15. public String getUpToken() {
  16. return auth.uploadToken(bucketName,3600);//3600为token的有效时间,单位ms;在这里只设置bucketName的话,可以上传任意名称的资源,但是如果资源的key重复了的话会上传失败
  17. //return auto.uploadToken(bucketName,key,3600);如果设置了bucketName和key两个参数的话,必须上传资源的key就固定了,这样如果七牛云上没有相同key名的话就会创建一个,如果有相同key的资源的话会覆盖掉七牛云上原有的文件.
  18. // return auth.uploadToken(bucketname, key, 3600, new StringMap().put("insertOnly", 1 ));//如果同时设置了insertOnly,上传以后这个文件不会允许修改,也不会发生覆盖.
  19. }
  20. public void upload() throws IOException {
  21. try {
  22. // 调用put方法上传
  23. Response res = uploadManager.put(FilePath, key, getUpToken());
  24. // 打印返回的信息
  25. System.out.println(res.bodyString());
  26. } catch (QiniuException e) {
  27. Response r = e.response;
  28. // 请求失败时打印的异常的信息
  29. System.out.println(r.toString());
  30. try {
  31. // 响应的文本信息
  32. System.out.println(r.bodyString());
  33. } catch (QiniuException e1) {
  34. // ignore
  35. }
  36. }
  37. }
  38. public static void main(String args[]) throws IOException {
  39. new UploadDemo().upload();
  40. }

4. 下载的demo

  1. public class DownloadDemo {
  2. // 设置好账号的ACCESS_KEY和SECRET_KEY
  3. String ACCESS_KEY = Constants.QINIU_ACCESS_KEY;
  4. String SECRET_KEY = Constants.QINIU_SECRET_KEY;
  5. // 密钥配置
  6. Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
  7. // 构造私有空间的需要生成的下载的链接
  8. String URL = Constants.QINIU_DOMAIN_PRIVATE + "/test/bigbear.jpg";
  9. public void download() {
  10. // 调用privateDownloadUrl方法生成下载链接,第二个参数可以设置Token的过期时间
  11. String downloadRUL = auth.privateDownloadUrl(URL, 3600);
  12. }
  13. public static void main(String args[]) {
  14. new DownloadDemo().download();
  15. }
  16. }

5.C#的demo

这是一个覆盖上传的demo

  1. namespace ConsoleDemo
  2. {
  3. class UploadDemo
  4. {
  5. private void upload()
  6. {
  7. //设置账号的AK和SK
  8. Qiniu.Conf.Config.ACCESS_KEY = "Access_Key";
  9. Qiniu.Conf.Config.SECRET_KEY = "Secret_Key";
  10. IOClient target = new IOClient();
  11. PutExtra extra = new PutExtra();
  12. //设置上传的空间
  13. String bucket = "bucket_name";
  14. //设置上传的文件的key值
  15. String key = "yourdefinekey";
  16. //覆盖上传,<bucket>:<key>,表示只允许用户上传指定key的文件。在这种格式下文件默认允许“修改”,已存在同名资源则会被本次覆盖。
  17. PutPolicy put = new PutPolicy(bucket+":"+key, 3600);
  18. //设置callbackUrl以及callbackBody,七牛将文件名和文件大小回调给业务服务器
  19. put.CallBackUrl = "http://your.domain.com/callback";
  20. put.CallBackBody = "filename=$(fname)&filesize=$(fsize)";
  21. //调用Token()方法生成上传的Token
  22. string upToken = put.Token();
  23. //上传文件的路径
  24. String filePath = "/.../...";
  25. //调用PutFile()方法上传
  26. PutRet ret = target.PutFile(upToken, key, filePath, extra);
  27. //打印出相应的信息
  28. Console.WriteLine(ret.Response.ToString());
  29. Console.WriteLine(ret.key);
  30. Console.ReadLine();
  31. }
  32. static void Main(string[] args)
  33. {
  34. //实例化UploadDemo对象并调用设置的upload方法
  35. UploadDemo Upload = new UploadDemo();
  36. Upload.upload();
  37. }
  38. }
  39. }

下载的demo

  1. namespace ConsoleDemo
  2. {
  3. class Download
  4. {
  5. public static void download()
  6. {
  7. //设置需要操作的账号的AK和SK
  8. Qiniu.Conf.Config.ACCESS_KEY = "Access_Key";
  9. Qiniu.Conf.Config.SECRET_KEY = "Secret_Key";
  10. //构造私有空间的需要生成的下载的链接
  11. string baseUrl = "http://bucketdomain/key";
  12. //调用MakeRequest方法生成私有下载链接
  13. string private_url = GetPolicy.MakeRequest(baseUrl);
  14. Console.WriteLine(private_url);
  15. Console.ReadLine();
  16. }
  17. static void Main(string[] args)
  18. {
  19. Download.download();
  20. }
  21. }
  22. }

官方C# SDK文档
官方java SDK文档

客户端直传功能实现(java+js)

js的引入:

plupload.full.min.js,qiniu.js
七牛SDK依赖于plupload.full.min.js

相关js代码

  1. 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;

});

  1. html页面

html

  1. <div class="upload-file-wrap">
  2. <input name="isQiniuLogo" type="hidden" value="{{isQiniuLogo}}">
  3. <input name="portrait" type="hidden" value="{{portrait}}">
  4. <input type="hidden" name="localLogoPath" value="" disabled>
  5. <!-- <a class="hidden" data-purpose="upload"></a> -->
  6. <input id="logoUpload" name="upload" title="支持jpg、jpeg、gif、png格式,文件小于10M" type="file">
  7. </div>

七牛js-sdk详细地址

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注