一、七牛云对象存储

对个人博客提供上传图片功能的时候,发现图片上传到服务器多了后,服务器内存空间会比较吃力,所以抛弃了这一做法改有道云做图床生成第三方链接存入数据库,有效避免了占用服务器空间的压力,后期维护的时候,又发现有道云做图床太麻烦了,上传图片时要打开有道云获取链接,到浏览器访问获取图片链接地址,一张两张还好,多了真折腾人,偶然看到七牛云做图片云储存的文章,注册每月都送10G存储空间和流量等等福利,于是就动手掰扯起来了(注意https流量是收费的)。

1、新建空间
注册登录就不说了,主要针对于图片存储

在这里插入图片描述
进入对象存储菜单,点击“新建存储空间”,然后需要实名认证,上传身份证正反面之类的,几分钟就审核完了这效率没得说

在这里插入图片描述
然后即就有了一个个人仓库了,系统会给我们分配一个测试域名,不过这个域名只有30天有效期,我们可以先用这个域名进行测试,后面来绑定自己的域名

新建空间好我们需要查看一下,为图片上传提供必要的参数。

AccessKey:点击右上角的头像【个人中心】----【密钥管理】
SecretKey:和获取AccessKey的方法一样
空间名称:创建空间时取的名称,我这里是:qingfenginn-img
访问网址:点开qingfenginn-img空间,也就是【空间概览】,咱们先用七牛云提供的CDN测试域名
存贮区域:我这里是华南,也就是z2

在这里插入图片描述

二、七牛云配置自己的域名

首先, 你得有一个已经备好案的域名,并且绑定了你的服务器,然后再配置一个二级域名用来访问图片用,我的域名是:qingfeng.top,配置的二级域名为:img-qingfenginn.top

  1. 获取CNAME
    1.1 配置二级域名
    在绑定自己域名的时候,需要配置加速域名指向 CNAME,这里我们可以配置一个二级域名
    在这里插入图片描述
    在这里插入图片描述
    1.2解析域名
    配置服务器解析域名需要在实例控制台进行操作,先登录服务器控制台,我域名买的是是阿里云,这里就以阿里云为例,其他服务器厂商操作基本一致。
    1.3添加解析记录
    找到域名管理,域名解析,添加域名记录。

主机记录:和之前在七牛云添加的二级域名保持一致,我配的是img-qingfenginn.top所以这里填:img
记录类型:选择CNAME
记录值:填写之前在七牛云复制的CNAME值
其他默认就好

1.4检测
就这样,服务器解析域名完成,接下来就是等待审核通过,通过后可以在cmd命令窗口进行检测,【win+r】快捷键输入cmd,打开命令窗口,使用以下命令:

nslookup + 七牛云配置的二级域名
比如:nslookup img-qingfenginn.top

可以看到解析的CNAME值,就成功了!

三、工具类实现图片上传

1.在pom.xml添加七牛云依赖

我的项目使用了maven管理jar包,所以只需直接添加相应依赖即可

<!--七牛云-->
<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>7.2.6</version>
</dependency>

工具类中会用到前面配置空间得到的配置参数

accessKey:访问授权码
secretKey:秘密钥匙
bucket:空间名称
domain:外链域名(就是你的服务器域名,前面配了七牛云的二级域名绑定了阿里云的服务器域名,之后保存的图片会以外链链接的形式保存起来)

/**
 * 七牛云工具类
 * Zone.zone0:华东
 * Zone.zone1:华北
 * Zone.zone2:华南
 * Zone.zoneNa0:北美
 * ———http上传,自动识别上传区域——
 * Zone.httpAutoZone
 * ———https上传,自动识别上传区域—— //Zone.httpsAutoZone
 * Configuration cfg = new Configuration(Zone.zone2());其中Configuration中的Zone.zone2()可以改为Zone.zone0()
 */
public class QiniuUtils {
	//访问授权码
    public  static String accessKey = "NmqvfVvXetScbrEOXgTE2Szg21qdSxp-sTRHaBSB";
    //秘密钥匙
    public  static String secretKey = "ft26PJWXnAfs6QksAnHQT85FqDDv2VUXP-AXjEt8";
    //空间名称
    public  static String bucket = "picture-server01";
    //外链域名
    public static String domain = "http://qcsorc5ip.bkt.clouddn.com/";
	
	//上传方式一:外链+文件名 获取其他图片链接进行上传
    public static void upload2Qiniu(String filePath,String fileName){
        //构造一个带指定Zone对象的配置类
        Configuration cfg = new Configuration(Zone.zone2());
        UploadManager uploadManager = new UploadManager(cfg);
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);
        try {
            Response response = uploadManager.put(filePath, fileName, upToken);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
        } catch (QiniuException ex) {
            Response r = ex.response;
            try {
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
        }
    }

    //上传方式二:文件上传 通过上传文件的方式上传到存储空间
    public static String upload2Qiniu(byte[] bytes, String fileName){
        //构造一个带指定Zone对象的配置类
        Configuration cfg = new Configuration(Zone.zone2());
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);

        //默认不指定key的情况下,以文件内容的hash值作为文件名
        String key = fileName;
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);
        try {
            Response response = uploadManager.put(bytes, key, upToken);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            System.out.println(putRet.key);
            System.out.println(putRet.hash);
            //返回文件完整路径
            return domain+putRet.key;
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());
            try {
                System.err.println(r.bodyString());
                return "";
            } catch (QiniuException ex2) {
                //ignore
            }
        }
        return "";
    }

    //删除文件 参数:存储的图片文件名
    public static void deleteFileFromQiniu(String fileName){
        //构造一个带指定Zone对象的配置类
        Configuration cfg = new Configuration(Zone.zone2());
        String key = fileName;
        Auth auth = Auth.create(accessKey, secretKey);
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
            bucketManager.delete(bucket, key);
        } catch (QiniuException ex) {
            //如果遇到异常,说明删除失败
            System.err.println(ex.code());
            System.err.println(ex.response.toString());
        }
    }
}

此工具类中注意事项:
(1)获取需要操作的账号的AK和SK(在七牛云个人中心中)
public static String accessKey = “NmqvfVvXetScbrEOXgTE2Szg21qdSxp-sTRHaBSB”;
public static String secretKey = “ft26PJWXnAfs6QksAnHQT85FqDDv2VUXP-AXjEt8”;
进入个人中心-密钥管理

3、获取图片上传URL路径
后端代码调用,工具类方法实现图片上传(可根据需要自己更改代码)

@RequestMapping("/upload")
@ResponseBody
public HashMap<String, Object> upload(@RequestParam("file") MultipartFile imgFile){
    HashMap<String,Object> result = new HashMap<String,Object>();
    String originalFilename = imgFile.getOriginalFilename();//获取图片原始文件名
    int index = originalFilename.lastIndexOf(".");
    String extention = originalFilename.substring(index);//获得图片后缀名  .jpg
    String fileName = UUID.randomUUID().toString() + extention; //进行拼接
    fileName = fileName.replace("-",""); //将文件路径中的-替换掉
    try {
        //使用工具类将文件上传到七牛云服务器
        String filePath = QiniuUtils.upload2Qiniu(imgFile.getBytes(),fileName);
        result.put("filePath",filePath);
    } catch (IOException e) {
        throw new BusinessException("上传图片失败!",e.getMessage());
    }
    return result;
}

查看的话,可以在代码中修改,将图片路径存储到数据库中,查看时到数据库中将路径查询出来,返给前端,前端拿到链接访问即可。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐