文件上传——七牛云

本文档详细介绍了如何使用七牛云服务进行文件存储,包括注册认证、创建存储空间、配置域名、SDK集成以及Java SDK的使用方法,涉及文件上传、删除等操作。通过实例代码展示了如何在Spring Boot应用中配置七牛云存储并实现文件上传到七牛云的API接口。

七牛云简介

七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化PaaS服务。围绕富媒体场景,七牛先后推出了对象存储,融合CDN加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

七牛云对象存储 Kodo 是七牛云提供的高可靠、强安全、低成本、可扩展的存储服务。您可通过控制台、API、SDK 等方式简单快速地接入七牛存储服务,实现海量数据的存储和管理。通过 Kodo 可以进行文件的上传、下载和管理。

总的来说:七牛云是为开发服务的云存储环境,可以在七牛云上托管静态文件资源,并且进行下载,还有很多七牛云的sdk。
具体有关七牛云的介绍可以参考开发文档:https://developer.qiniu.com/kodo

七牛云使用前

  1. 首先先去七牛云官方注册一个账号——>七牛云官方,注册完毕之后,点击个人中心
    在这里插入图片描述

  2. 然后进行身份认证,按照步骤进行认证(1-2天认证完成)

  3. 当身份认证完成之后,再点击对象存储,然后新建存储空间
    在这里插入图片描述
    在这里插入图片描述

  4. 然后会进入一个界面,让你输入空间名称还有存储区域,以及访问控制,按照要求填写即可
    在这里插入图片描述

  5. 创建好空间之后就可以对空间进行管理,也可以绑定域名
    在这里插入图片描述
    如果需要使用七牛云进行api接口开发,就必须要进行备案域名的绑定,且要对域名进行按要求解析
    (刚注册的时候好像有免费的测试使用域名,但是我有自己的域名就没有使用测试域名)

  6. 域名绑定与解析
    点击空间管理,进入域名管理,即可以添加绑定域名。
    在这里插入图片描述
    进入添加域名的界面后,按要求填写相关信息即可(域名一定要是备案域名)
    在这里插入图片描述
    绑定了域名之后,会有一个审核时间(差不多5-10分钟),之后就可以对域名进行解析。
    在这里插入图片描述
    接下来参考官方文档的解析过程:如何配置域名的 CNAME
    我使用的域名是泛子域名,用的是腾讯云的域名:
    在这里插入图片描述
    根据文档对在七牛云上绑定了的域名做对应的记录值解析即可。

  7. 完成以上的操作就可以使用七牛云sdk进行开发了。

使用七牛云SDK开发

主要使用的java的sdk,也可以根据自己的需求参考官方文档:https://developer.qiniu.com/kodo

开发步骤

  1. 导入SDK坐标
<!--七牛云-->
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>7.2.7</version>
        </dependency>

        <!--工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.3.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17-beta1</version>
        </dependency>
  1. 编写配置信息(application.properties)
qiniu.ACCESS_KEY=七牛云AK
qiniu.SECRET_KEY=七牛云SK
qiniu.bucketname=七牛云创建空间的名称
qiniu.QINIU_IMAGE_DOMAIN=七牛云绑定的域名

七牛云的配置信息都可以在个人中心拿到,其中AK和SK:点击密钥管理
在这里插入图片描述
在这里插入图片描述

  1. 编写七牛云相关的配置文件(QiNiuConfig.java)
package cn.kt.qinu_demo.config;

import com.qiniu.common.Zone;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author tao
 * @date 2021-03-28 1:25
 * 概要:
 */

@Data
@Component
//从配置文件里获取
@ConfigurationProperties(prefix = "qiniu")
public class QiNiuConfig {

    // 设置好账号的ACCESS_KEY
    private String ACCESS_KEY;

    // 设置好账号的SECRET_KEY
    private String SECRET_KEY;

    // 设置七牛要上传的空间
    private String bucketname;

    // 设置关联七牛的域名
    private String QINIU_IMAGE_DOMAIN;

    // 密钥配置
    public Auth getAuth() {
        // 构造一个带指定Zone对象的配置类,不同的七云牛存储区域调用不同的zone
        Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
        return auth;
    }

    /* 构造一个带指定Zone对象的配置类,不同的七云牛存储区域调用不同的zone
        华东:zone0
        华北:zone1
        华南:zone2
        北美:zoneNa0
     */
    public Configuration getConfiguration() {
        Configuration cfg = new Configuration(Zone.zone2());
        return cfg;
    }

    // 构造一个七牛manager
    public UploadManager getUploadManager() {
        UploadManager uploadManager = new UploadManager(getConfiguration());
        return uploadManager;
    }

    // 构造一个七牛manager
    public BucketManager getBucketManager() {
        BucketManager bucketManager = new BucketManager(getAuth(), getConfiguration());
        return bucketManager;
    }

    // 简单上传,使用默认策略
    // ,只需要设置上传的空间名就可以了
    public String getUpToken() {
        return getAuth().uploadToken(getBucketname());
    }
}
  1. 编写操作七牛的工具类(QiNiuUtil.java)
package cn.kt.qinu_demo.utils;

import cn.kt.qinu_demo.config.QiNiuConfig;
import com.alibaba.fastjson.JSONObject;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.PostConstruct;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * @author tao
 * @date 2021-03-27 17:19
 * 概要:操作七牛云的工具类
 */
@Component
@Slf4j
public class QiNiuUtil {

    @Autowired
    private QiNiuConfig config;

    private static QiNiuConfig qiNiuConfig;

    //初始化静态参数
    //通过@PostConstruct实现初始化bean之前进行的操作
    @PostConstruct
    public void init() {
        qiNiuConfig = config;
    }

    //储存图片文件
    public static String saveFile(MultipartFile file, String fileName) throws IOException {
        try {
            // 调用put方法上传
            Response res = qiNiuConfig.getUploadManager().put(file.getBytes(), fileName, qiNiuConfig.getUpToken());
            // 打印返回的信息
            if (res.isOK() && res.isJson()) {
                // 返回这张存储照片的地址
                return qiNiuConfig.getQINIU_IMAGE_DOMAIN() + JSONObject.parseObject(res.bodyString()).get("key");

            } else {
                log.error("七牛异常:" + res.bodyString());
                return null;
            }
        } catch (QiniuException e) {
            // 请求失败时打印的异常的信息
            log.error("七牛异常:" + e.getMessage());
            return null;
        }
    }

    //储存图片文件
    public static String deleteFile(String fileName) throws IOException {
        BucketManager bucketManager = qiNiuConfig.getBucketManager();
        try {
            //七牛云删除
            bucketManager.delete(qiNiuConfig.getBucketname(), fileName);
            //数据库删除


            return "success";
        } catch (QiniuException ex) {
            //数据库删除

            return "failed";
        }
    }

    //获取UUID+Date的文件名
    public static String getUUIDFileNameNow(String fileName) {
        int dotPos = fileName.lastIndexOf(".");
        if (dotPos < 0) {
            return null;
        }//获取文件后缀
        String fileExt = fileName.substring(dotPos + 1).toLowerCase();
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddhhmmssS");
        String nowStr = "-" + format.format(date);
        String result = UUID.randomUUID().toString().replaceAll("-", "") + nowStr + "." + fileExt;
        return result;
    }
}
  1. 编写操作文件的工具类
    相关代码和介绍参考我上一篇博客:
    个人博客网站:http://qkongtao.cn/?p=560
    CSDN:https://blog.csdn.net/qq_42038623/article/details/114823328?spm=1001.2014.3001.5501

  2. 编写Controller层(QiNiuController.java)
    主要写了两个接口方法:

  • 文件上传,返回文件src路径
  • 删除文件:根据文件名删除存储在七牛云上的文件
    在代码中可以自己添加Service层和Dao层,对文件信息进行数据库持久层存储
    代码如下:
package cn.kt.qinu_demo.controller;

import cn.kt.qinu_demo.utils.FileUtil;
import cn.kt.qinu_demo.utils.QiNiuUtil;
import org.junit.platform.commons.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @author tao
 * @date 2021-03-27 17:52
 * 概要:
 */
@Controller
public class QiNiuController {

    //文件上传
    @RequestMapping(value = "/testUpload", method = RequestMethod.POST)
    @ResponseBody
    public String upload(@RequestParam("file") MultipartFile file) throws IOException {

        //判断文件是否为空
        if (file.isEmpty()) {
            return "error";
        }

        //获取文件后缀
        String suffix = FileUtil.getExtensionName(file.getOriginalFilename());
        //获取文件类型
        String type = FileUtil.getFileType(suffix);
        //获取文件大小
        FileUtil.getSize(file.getSize());
        //获取UUID+date文件名
        String fileName = QiNiuUtil.getUUIDFileNameNow(file.getOriginalFilename());
        //获取文件上传七牛云后的url
        String fileUrl = QiNiuUtil.saveFile(file, fileName);


        /**************************** 在这可以将数据信息进行数据库存储 **************************/
        return "src:" + fileUrl;
    }

    //文件删除
    @RequestMapping(value = "/testDelete", method = RequestMethod.DELETE)
    @ResponseBody
    public String delete(@RequestParam("fileName") String fileName) throws IOException {
        String res = QiNiuUtil.deleteFile(fileName);
        return res;
    }

}

开发接口测试

  1. 上传图片测试
  • Postman测试
    在这里插入图片描述

  • 七牛云上的文件管理
    在这里插入图片描述

  1. 删除文件测试
  • Postman测试
    在这里插入图片描述
  • 七牛云上的文件管理
    在这里插入图片描述
  1. 当然上传视频也是可以的
    在这里插入图片描述

源码下载

七牛云上传的项目源码见下一篇博客:图片上传api——chevereto个人图床搭建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不愿意做鱼的小鲸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值