08
2025
04
17:25:20

文件上传—七牛云OSS对象存储(超详细)

一、七牛云简介

七牛云(隶属于上海七牛信息技术有限公司)是国内领先的以视觉智能和数据智能为核心的企业级云计算服务商,同时也是国内知名智能视频云服务商,累计为 70 多万家企业提供服务,覆盖了国内80%网民。围绕富媒体场景推出了对象存储、融合 CDN 加速、容器云、大数据平台、深度学习平台等产品、并提供一站式智能视频云解决方案。为各行业及应用提供可持续发展的智能视频云生态,帮助企业快速上云,创造更广阔的商业价值。

我们主要使用的是七牛云提供的对象存储服务来存储图片。

二、七牛云OSS基本使用

1、注册账号

打开七牛云官网 七牛云 | 简单 可信赖| 简单 可信赖" style="box-sizing: border-box; outline: none; margin: 0px; padding: 0px; text-decoration-line: none; cursor: pointer; color: rgb(78, 161, 219); font-synthesis-style: auto; overflow-wrap: break-word;">七牛云 | 简单 可信赖 进行账号注册—登录—实名认证

2、基本配置

(1) 新建存储空间

(2) 配置基本信息

自定义存储空间名称,存储区域选择离自己近的,访问控制选择公开。

(3) 验证是否创建成功

依次点击“上传文件”—“选择文件”—“开始上传”

查看结果

(4) 查看秘钥

鼠标放在头像上,点击“秘钥管理”,可以看到我们的AccessKey和SecretKey,后续的配置要用到。

这样,基本配置就完成啦!

三、Java项目集成OSS

参考七牛云官方文档 Java SDK_SDK 下载_对象存储 - 七牛开发者中心

1. 导入依赖:

<dependency>
  <groupId>com.qiniu</groupId>
  <artifactId>qiniu-java-sdk</artifactId>
  <version>[7.16.0, 7.16.99]</version>
</dependency>

这里的version指定了一个版本范围,每次更新pom.xml的时候会尝试去下载7.16.x版本中的最新版本,你可以手动指定一个固定的版本。

2. 编写配置文件application.properties

#七牛云oss配置信息
qiniu.accessKey=████████████████████████████████████
qiniu.secretKey=████████████████████████████████████
qiniu.bucket=████████████████████████████████████
qiniu.hostName=████████████████████████████████████

别忘了在项目的配置文件中加载application.properties。

多个配置文件使用逗号隔开

<context:property-placeholder location="classpath:db.properties,classpath:application.properties"/>

3. 封装工具类

        在七牛开发者中心的 Java SDK 帮助文档中提供了图片上传和删除的官方使用案例,我对官方提供的使用案例进行了简单改造,封装成工具类 QiniuUtils,在项目中进行图片上传与删除时直接调用该工具类即可。

        在自己项目的utils包下创建QiniuUtils类,在类中定义uploadByBytes()方法,用于图片上传。定义delete()方法,用于图片删除。

package com.qcby.utils;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


@Component
public class QiniuUtils {
    // 通过 @Value 注解从配置文件中读取值
    @Value("${qiniu.accessKey}")
    private String accessKey;

    @Value("${qiniu.secretKey}")
    private String secretKey;

    @Value("${qiniu.bucket}")
    private String bucket;

    @Value("${qiniu.hostName}")
    private String hostName;

    public String uploadByBytes(byte[] bytes,String fileName){

        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.qvmHuabei());
        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
        //...其他参数参考类注释
        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 hostName+putRet.key;
        } catch (QiniuException ex) {
            ex.printStackTrace();
            if (ex.response != null) {
                System.err.println(ex.response);
                try {
                    String body = ex.response.toString();
                    System.err.println(body);
                } catch (Exception ignored) {
                }
            }
        }
        return null;
    }

    /**
     *删除图片
     * @param key
     * @return
     */
    public String delete(String key){
        Auth auth = Auth.create(accessKey,secretKey);
        Configuration cfg = new Configuration(Region.autoRegion());
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
            bucketManager.delete(bucket,key);
        }catch (QiniuException Q){
            return Q.toString();
        }
        System.out.println("success");
        return null;
    }

}

其中关于Region对象和机房的关系如下:

 注意

  • 若不指定 Region 或 Region.autoRegion() ,则会使用 自动判断 区域,使用相应域名处理。

  • 如果可以明确 区域 的话,最好指定固定区域,这样可以少一步网络请求,少一步出错的可能。

官方文档的说明如上,但是根据我的实操,Region对象的区域名称好像发生了变化:

 4. UploadController代码

package com.qcby.controller;

import com.qcby.model.Result;
import com.qcby.utils.QiniuUtils;
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.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.UUID;


@Controller
public class UploadController {

    @Autowired
    private QiniuUtils qiniuUtils;

    @ResponseBody
    @RequestMapping("/upload")
    public Result upload(MultipartFile multipartFile) throws IOException {
        //获取文件名称
        String originalFilename = multipartFile.getOriginalFilename();
        //获取后缀名
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //为了避免同名覆盖问题,构建新的文件名
        String fileName = UUID.randomUUID().toString() + suffix;

        //调用七牛云OSS工具类
        String url = qiniuUtils.uploadByBytes(multipartFile.getBytes(),fileName);
        //将图片上传完成后的url返回,用于浏览器回显展示
        return Result.success(url);
    }
}

5. 检验是否配置成功

由于我没写前端页面,我们使用postman对接口进行测试。

“Body选项卡”—“form-data”—输入key值—类型选择“file”—“Select Files”—“send”

查看结果:
查看七牛云:

文件上传成功!




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://zblog.hqyman.cn/post/10213.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: