静态资源云存储

前言

毫无目标的生活会导致自我的放纵,滋生懒惰。

只有被追赶着才能进步,谁在追赶着你?来自生活中的讽刺?还是自我的鞭挞?

工作之余,学点新东西还是不错的,七牛云存储一个很不错的云产品。

一、简介

七牛云存储:静态资源云端存储。产品主要面对的是开发者、企业用户,你可以把自己的项目、网站中的图片、文档、音频、视频等静态的资源存储在云端,还提供其他服务,比如视频音频转码,图片简单处理等。

点击七牛云存储注册,注册后首先是体验用户,身份认证后变成标准用户,区别如下:

功能特性 体验用户 标准用户
验证 邮箱验证 手机+邮箱+身份认证
额度限制 免费存储空间1G
免费每月下载流量1G
免费每月GET请求10万次
免费每月PUT/DELETE请求1万次
免费存储空间10G
免费每月下载流量10G
免费每月GET请求100万次
免费每月PUT/DELETE请求10万次
空间数量 1 20
空间访问控制 可修改 不可修改
内容限制 富媒体 不限制
FOP imageFop all
自定义域名 账户余额大于10元可用
防盗链 账户余额大于10元可用
https 可用
镜像存储 镜像富媒体 可用
访问日志 可用
抵用券 可用
账户冻结 实时冻结 50元>N,连续欠费30个自然日后冻结;
500元>N>50元,连续欠费3个自然日后冻结;
N>500元,实时冻结。*

*N表示账户余额。

二、Java API使用

七牛云存储用户可以有多个表空间,每个表空间相当于一个磁盘分区,分为共有的和私有的,所有的数据都是以<key,hashcode>的方式进行存储的,没有文件夹这一说法。当然你可以通过给文件加前缀来模拟文件夹,比如 “文档/公司/2.png”

七牛云存储下载java版的SDK(现在已经有很多语言的API了),在SDK中的Config类中进行配置:

//bucket
    public static final String BUCKETNAME="qiniuinas";

    //域名地址
    public static final String DOMAIL="qiniuinas.qiniudn.com";

    public static String ACCESS_KEY = "****************************************";

    public static String SECRET_KEY = "****************************************";

BUCKETNAME和DOMAIL是我自己加上去的,方便调用和配置,BUCKETNAME为表空间名称,DOMAIL为域名。

ACCESS_KEY和SECRET_KEY为你注册后的密钥。

个人写的工具类:

package com.inas.qiniu;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.qiniu.api.auth.digest.Mac;
import com.qiniu.api.config.Config;
import com.qiniu.api.fop.ImageView;
import com.qiniu.api.io.IoApi;
import com.qiniu.api.io.PutExtra;
import com.qiniu.api.io.PutRet;
import com.qiniu.api.net.CallRet;
import com.qiniu.api.rs.BatchCallRet;
import com.qiniu.api.rs.BatchStatRet;
import com.qiniu.api.rs.Entry;
import com.qiniu.api.rs.EntryPath;
import com.qiniu.api.rs.GetPolicy;
import com.qiniu.api.rs.PutPolicy;
import com.qiniu.api.rs.RSClient;
import com.qiniu.api.rs.URLUtils;
import com.qiniu.api.rsf.ListItem;
import com.qiniu.api.rsf.ListPrefixRet;
import com.qiniu.api.rsf.RSFClient;
import com.qiniu.api.rsf.RSFEofException;

/**
 * @project:
 *
 * @author: inas
 *
 * @creatDate:  2014-11-07
 *
 * @discrible: 七牛工具类
 *
 * @other:
 */
public class QiniuUtils {

    /**
     * delete : 根据文件名删除文件
     * @param key 文件名
     * @return 200:成功
     *         612:没有文件
     *         631:没有bucket
     */
    public static int delete(String key)
    {
        Mac mac = new Mac(Config.ACCESS_KEY, Config.SECRET_KEY);
        RSClient client = new RSClient(mac);
        CallRet ret=client.delete(Config.BUCKETNAME, key);
        return ret.getStatusCode();
    }

    /**
     * BatchDelete : 批量删除
     * @param listKey 文件名列表
     * @return null: 删除成功
     *         map: 部分删除失败  <文件名,删除结果>
     */
    public static Map<String, Integer> BatchDelete(List<String> listKey)
    {
        EntryPath entryPath=null;
        Map<String, Integer> map=new HashMap<String, Integer>();
        Mac mac = new Mac(Config.ACCESS_KEY, Config.SECRET_KEY);
        RSClient rs = new RSClient(mac);
        List<EntryPath> entries = new ArrayList<EntryPath>();
        for(String key:listKey)
        {
            entryPath=new EntryPath();
            entryPath.bucket=Config.BUCKETNAME;
            entryPath.key=key;
            entries.add(entryPath);
        }
        BatchCallRet bret = rs.batchDelete(entries);
        if(bret.ok())
        {
            return null;
        }
        else
        {
            for(int i=0;i<listKey.size();i++)
            {
                map.put(listKey.get(i), bret.results.get(i).statusCode);
            }
            return map;
        }
    }

    /**
     * deletePiefix : 删除带有指定前缀的文件
     * @param piefix
     * @return
     */
    public static Map<String, Integer> deletePiefix(String piefix)
    {
        List<String> keyList=new ArrayList<String>();
        List<ListItem> statList=getListStatByPrefix(piefix);
        for(ListItem li:statList)
        {
            keyList.add(li.key);
        }
        return BatchDelete(keyList);
    }

    /**
     * getFileStat : 获取单个文件的详细信息
     * @param key 文件名称
     * @return Entry 实体
     */
    public static Entry getStat(String key)
    {
        Mac mac = new Mac(Config.ACCESS_KEY, Config.SECRET_KEY);
        RSClient client = new RSClient(mac);
        Entry statRet = client.stat(Config.BUCKETNAME, key);
        return statRet;
    }

    /**
     * getListStat : 获取多个文件的文件信息
     * @param listKey 文件列表
     * @return BatchStatRet 文件信息
     */
    public static BatchStatRet getListStat(List<String> listKey)
    {
        EntryPath entryPath=null;
        Mac mac = new Mac(Config.ACCESS_KEY, Config.SECRET_KEY);
        RSClient rs = new RSClient(mac);
        List<EntryPath> entries = new ArrayList<EntryPath>();
        for(String key:listKey)
        {
            entryPath=new EntryPath();
            entryPath.bucket=Config.BUCKETNAME;
            entryPath.key=key;
            entries.add(entryPath);
        }
        BatchStatRet bret = rs.batchStat(entries);
        return bret;
    }

    /**
     * getListStatByPrefix : 获取指定前缀的文件列表(pix 为"" 获取所有文件信息)
     * @param listKey
     * @param pix
     * @return
     */
    public static List<ListItem> getListStatByPrefix(String pix)
    {
        Mac mac = new Mac(Config.ACCESS_KEY, Config.SECRET_KEY);
        RSFClient client = new RSFClient(mac);
        String marker = "";
        List<ListItem> all = new ArrayList<ListItem>();
        ListPrefixRet ret = null;
        while (true)
        {
            ret = client.listPrifix(Config.BUCKETNAME, pix, marker,1000); //1000获取的条数限制,最多1000条
            marker = ret.marker;
            all.addAll(ret.results);
            if (!ret.ok())
            {
                break;
            }
        }
        if (ret.exception.getClass() != RSFEofException.class)
        {
            return null;
        }
        return all;
    }

    /**
     * getListStatByPrefix : 模糊搜索文件
     * @param key
     * @return
     */
    public static Map<String, Integer> getListByName(String key)
    {
        return null;
    }

    /**
     * download : 根据文件名获取文件下载链接(私有)
     * @param key
     * @return
     * @throws Exception
     */
    public static String download(String key) throws Exception
    {
        Mac mac = new Mac(Config.ACCESS_KEY, Config.SECRET_KEY);
        String baseUrl = URLUtils.makeBaseUrl(Config.DOMAIL, key);
        GetPolicy getPolicy = new GetPolicy();
        return getPolicy.makeRequest(baseUrl, mac);
    }

    /**
     * download :根据域名和文件名获取文件下载地址(共有)
     * @param domain 域名
     * @param key 文件名
     * @return 下载URL
     */
    public static String download(String domain,String key)
    {
        return "http://"+domain+"/"+key;
    }

    /**
     * downloadList : 批量获取文件下载地址
     * @param listKey 文件名列表
     * @return map<文件名,文件下载地址>
     * @throws Exception
     */
    public static Map<String, String> downloadList(List<String> listKey) throws Exception
    {
        Map<String, String> map=new HashMap<String, String>();
        for(int i=0;i<listKey.size();i++)
        {
            map.put(listKey.get(i), download(listKey.get(i)));
        }
        return map;
    }

    /**
     * upload : 上传文件
     * @param localFile 本地文件地址
     * @param key 文件名
     * @return 200:成功
     *         612:没有文件
     *         631:没有bucket
     */
    public static int upload(String localFile,String key) throws Exception
    {
        Mac mac = new Mac(Config.ACCESS_KEY, Config.SECRET_KEY);
        PutPolicy putPolicy = new PutPolicy(Config.BUCKETNAME);
        String uptoken = putPolicy.token(mac);
        PutExtra extra = new PutExtra();
        PutRet ret = IoApi.putFile(uptoken, key, localFile, extra);
        return ret.getStatusCode();
    }

    /**
     * copy :文件复制
     * @param bucketFrom 表空间名称
     * @param keyFrom  文件名
     * @param buckeTo  表空间名称
     * @param keyTo  文件名
     * @return 200:成功
     *         612:没有文件
     *         631:没有bucket
     */
    public static int copy(String bucketFrom,String keyFrom,String buckeTo,String keyTo)
    {
         Mac mac = new Mac(Config.ACCESS_KEY, Config.SECRET_KEY);
         RSClient client = new RSClient(mac);
         CallRet ret=client.copy(bucketFrom, keyFrom, buckeTo, keyTo);
         return ret.getStatusCode();
    }

    /**
     * move :文件移动
     * @param bucketFrom 表空间名称
     * @param keyFrom  文件名
     * @param buckeTo  表空间名称
     * @param keyTo  文件名
     * @return 200:成功
     *         612:没有文件
     *         631:没有bucket
     */
    public static int move(String bucketFrom,String keyFrom,String buckeTo,String keyTo)
    {
         Mac mac = new Mac(Config.ACCESS_KEY, Config.SECRET_KEY);
         RSClient client = new RSClient(mac);
         CallRet ret=client.move(bucketFrom, keyFrom, buckeTo, keyTo);
         return ret.getStatusCode();
    }

    /**
     * fopImageView : 生成图片预览地址
     * @param domain 域名
     * @param key 文件名
     * @return url地址
     * @throws Exception
     */
    public static String fopImageView(String domain,String key) throws Exception
    {
        Mac mac = new Mac(Config.ACCESS_KEY, Config.SECRET_KEY);
        String url = "http://"+domain+ "/" + key;
        ImageView iv = new ImageView();
        iv.mode = 1 ;
        iv.width = 100 ;
        iv.height = 200 ;
        iv.quality = 1 ;
        iv.format = "png" ;
        String viewUrl = iv.makeRequest(url);
        viewUrl = new GetPolicy().makeRequest(viewUrl, mac);
        return viewUrl;
    }
}

三、七牛云存储server返回结果说明

服务器返回结果的基类是 CallRet 即返回结果

属性: statusCode  执行状态标识

*         200:成功
     *         612:没有文件

*         631:没有表空间

*         401:下载token认证失败

response:返回的结果

exception: 返回的异常

方法: ok() :是否操作成功

以下方法都继承CallRet 方法:

BatchCallRet: List<Callret>

Entry :附加了一些文件的属性

BatchStatRet :List<Entry >

ListPrefixRet :附加了前缀属性

PutRet:上传返回结果

以上只是简单的说明,更详细的查看API文档里面每个方法的详细定义,理解肯定更深刻。

总结

七牛云存储对于开发者来说还是不错的,只需要在项目中封装好一个jar包就可以很简单的把一些静态资源存储在云端,对于个人开发的产品或者一些企业产品,免费的标准用户的资源已经足够了使用了。java sdk很多的地方还不够完善。

时间: 2024-10-09 16:00:00

静态资源云存储的相关文章

LAMP+NFS实现多个web服务器静态资源统一存储

需求分析: 1.前端需支持更大的访问量,单台Web服务器已无法满足需求了,则需扩容Web服务器: 2.虽然动态内容可交由后端的PHP服务器执行,但静态页面还需要Web服务器自己解析,那是否意味着多台Web服务器都需要在各自的系统中都存有一份静态页面数据呢? 其实这样也不是不可以,毕竟文件本地访问,速度还是有优势的,但这却涉及到多台Web服务器间内容的一致性问题,这种问题也不可避免: 那么如果能将静态页面集中存放,所有Web服务器都来集中地取文件,对于文件的一致性就有了保障,这个集中地就叫做"文件

国内站点经常使用的一些 CDN 静态资源公共库加速服务

web开发人员们的福利来了..旨在为大家提供更快很多其它更好的静态资源库的CDN载入库方案! CDN公共库是指将经常使用的JS库存放在CDN节点,以方便广大开发人员直接调用. 与将JS库存放在server单机上相比,CDN公共库更加稳定.快速.一 般的CDN公共库都会包括全球全部最流行的开源JavaScript.JQuery等库.你能够在自己的网页上直接通过script标记引用这些资源.这样做不仅能够为您 节省流量.还能通过CDN加速.获得更快的訪问速度.注意站点要支持ssl的有些资源慎用.最好

国内网站常用的一些 CDN 静态资源公共库加速服务

web开发者们的福利来了.. CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将JS库存放在服务器单机上相比,CDN公共库更加稳定.高速.一 般的CDN公共库都会包含全球所有最流行的开源JavaScript.JQuery等库,你可以在自己的网页上直接通过script标记引用这些资源.这样做不仅可以为您 节省流量,还能通过CDN加速,获得更快的访问速度.注意网站要支持ssl的有些资源慎用.最好的方法就下载到网站的对应目录,然后代码调用即可. 目前国内的一些比较大的公共C

百度云存储教程---免费建立自己的静态网站

欢迎訪问的我个人站点:点击打开链接--我的个人站点    想建设个人站点的朋友能够找我聊.无门槛,就能永远自己的永久域名和server空间,全然免费哦 曾经开发的站点苦于没有云server,站点没地方挂,如今百度出了云存储和应用引擎,能够让开发人员免费上传动态站点和静态站点.这篇文章,我准备用云存储的方式,存储用户的静态站点,开发人员可通过将静态页面上传至云存储空间中,并将其訪问权限设置为公开读,就可以实现静态站点的效果.文章底部有源代码和项目下载. 一.实现效果 本地目录 上传成后百度云存储的

中大型网站静态资源优化及存储

静态资源优化: 合并 减少http请求有这样几个优点: (1) 减少DNS请求所耗费的时间 (2) 减少服务器压力(CPU,IO) (3) 减少http请求头(当我们对服务器发起一个请求的时候,我们会携带着这个域名下的cookie和一些其他的信息在http头部里,然后服务器响应请求的时候也会带回一些cookie之类的头部信息.这些信息有的时候会很大,在这种请求和响应的时候会影响带宽性能) 合并请求: lvmama首页 <link rel="stylesheet" href=&qu

[分享黑科技]纯js突破localstorage存储上线,远程抓取图片,并转码base64保存本地,最终实现整个网站所有静态资源离线到用户手机效果却不依赖浏览器的缓存机制,单页应用最新黑科技

好久没有写博客了,想到2年前答应要放出源代码的也没放出来,最近终于有空先把纯js实现无限空间大小的本地存储的功能开源了,项目地址https://github.com/xueduany/localstore,demo见http://xueduany.github.io/localstore/,下面给大家简单说说大概原理,具体细节和异常处理后面有机会在单独说 先说下突破本地localStorage的原理,官方原话是这么说的http://www.w3.org/TR/2013/PR-webstorage

利用多域名存储静态资源进行性能优化:网站的静态资源为什么要使用独立域名

在大型网站中,我们发现页面资源经常使用不同的域名进行引用,例如126邮箱的部分js.css.图片存放于http://mimg.127.net/域名下,京东的部分静态图片存放在http://img11.360buyimg.com域名下,那这样做究竟有什么好处呢,和性能又有什么关系呢,下面进行具体分析. 一.浏览器并发请求数的限制 我们进行网站页面访问时的客户端是浏览器,浏览器的很多机制对网站的访问速度有很大的影响(例如浏览器对静态资源的缓存机制),此外浏览器为提升页面显示效率,支持并发获取资源,但

微信小游戏资源加载页与云存储

------------恢复内容开始------------ 微信小游戏为什么要有开始资源加载页? 当小游戏包过大的时候,我们如何优化包的大小,最直接的先把图片或者声音等资源放到云端,等小游戏初始化后再从云端下载到本地,而小游戏包里只放代码和几张简单的加载图. 为什么微信加载资源的页面和初始化的页面是两个页面? 微信小游戏自带初始化页面是,微信从云端下载小游戏代码到本地(这个是自带的,不需要处理,更没有必要再自定义).资源加载页是,当小游戏初始化完成后再下载资源图片和其他媒体素材,如果没有下载进

静态资源(JS/CSS)存储在localStorage

一.简单了解SEO SEO由英文Search Engine Optimization缩写而来, 中文意译为“搜索引擎优化”.SEO是指从自然搜索结果获得网站流量的技术和过程. 搜索引擎不优化的网站分为以下特征: 1.网页中大量采用图片或者Flash等富媒体(Rich Media)形式,没有可以检索的文本信息,而SEO最基本的就是文章SEO和图片SEO: 2.网页没有标题,或者标题中没有包含有效的关键词: 3.网页正文中有效关键词比较少(最好自然而重点分布,不需要特别的堆砌关键词): 4.网站导航