基于七牛云上传,下载文件

news2024/11/16 8:41:30

准备工作

1.创建一个七牛云账号

2.登录账号,进入个人中心,创建一组密钥(ak和sk)

3. 创建一个公有的存储空间(桶)

注:存储地区的选择基于你的用户的分布主要在哪里。

七牛云直接白送10GB给我们玩,很适合做项目想白嫖的小伙伴。

实战演练 

Java SDK_SDK 下载_对象存储 - 七牛开发者中心(这里的代码仅供参考)

1.springboot项目中导入必要的依赖

        <!--        七牛云-->
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>[7.13.0, 7.13.99]</version>
        </dependency>

<!--        gson,上传文件时要用-->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
            <scope>compile</scope>
        </dependency>

<!--        @ConfigurationProperties注解爆红-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

2.yml文件中填入ak,sk和桶的相关配置

qiniu:
  accessKey: z3214mq2xG5w7-KHQk7oBiJC6sbjrjmlVNai0sai
  secretKey: _wys_Vf2RWpZqG9Hnlq32lQ17wvULnHeJSIjnGez
  bucket: gmgx2024
  prefixUrl: http://siz0shti6.jl-cnm.clouddn.com/

 prefixUrl在这

3.写一个QiniuConfig来接收这些配置

@ConfigurationProperties(prefix = "qiniu")
@Data
@Component
public class QiniuConfig {
    private String accessKey;
    private String secretKey;
    private String bucket;
    private String prefixUrl;
}

4.编写上传文件的核心代码

为什么只有上传?因为这个桶是公有的,只需要上传时把返回的url存到数据库中,要下载文件时输入url即可下载。(最后介绍私有桶的上传和下载)

 控制器

@Tag(name="文件控制器",description = "基于七牛云实现文件上传和下载")
@RestController
@RequestMapping("file")
public class FileController {
    @Autowired
    private FileService fileService;
    
    @Operation(summary = "uploadFile",description = "基于七牛云上传文件")
    @PostMapping("/uploadFile")
    public Result uploadFile(MultipartFile file){
        String url = fileService.upload(file);
        if(url!=null){
            return new Result(Code.UPLOAD_SUCCESS,"文件上传成功",url);
        }
        return new Result(Code.UPLOAD_FAIL,"文件上传失败",null);
    }
    
}

服务类

package com.example.qiniufileupload.service.impl;
import com.example.qiniufileupload.config.QiniuConfig;
import com.example.qiniufileupload.service.FileService;
import com.google.gson.Gson;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {

    @Autowired
    private QiniuConfig qiniuConfig;

    /**
     * 
     * @param file   要上传到七牛云的文件
     * @return url   上传后的文件的完整url
     */
    public String upload(MultipartFile file) {

        try {
            // 获取文件的名字   aaa.jpg
            String originalFilename = file.getOriginalFilename();

            //file扩展名 extendFileName    jpg
            String extendFileName = originalFilename.substring(originalFilename.lastIndexOf("."));

            // 默认不指定key的情况下,以文件内容的hash值作为文件名 时间日期前缀
            LocalDate currentDate = LocalDate.now();
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd/");

            // todo:构建新的文件名    2024/8/29/一个uuid.jpg
            String key = currentDate.format(formatter) + UUID.randomUUID().toString().replace("-", "") + extendFileName;


            // 构造一个带指定 Region 对象的配置类
            Configuration zone = new Configuration(Zone.huanan());//我们刚开始选的是华南地区


            // 从 MultipartFile 直接获取输入流,避免先保存到本地再上传
            InputStream inputStream = file.getInputStream();

            //创建Auth对象,填写ak和sk
            Auth auth = Auth.create(qiniuConfig.getAccessKey(), qiniuConfig.getSecretKey());
            //获得上传凭证
            String upToken = auth.uploadToken(qiniuConfig.getBucket());
            System.out.println(upToken);
            //z3214mq2xG5w7-KHQk7oBiJC6zojrjmlVNcn0sai:oHRCCHPiB2YlJxxCYtDyVOb3lCs=:eyJzY29wZSI6ImdtZ3gyMDI0IiwiZGVhZGxpbmUiOjE3MjQ5Mjc2NjN9


            //隐藏了判空条件
            try (InputStream ignored = inputStream)
            {
                UploadManager uploadManager = new UploadManager(zone);//指定zone

                //上传图片到七牛云
                Response response = uploadManager.put(inputStream, key, upToken,null,null);

                /**
                 * 用gson将浏览器响应的body字符串解析成DefaultPutRet的实例化对象
                 *                                     ↓
                 *          public final class DefaultPutRet {
                 *              public String hash;
                 *              public String key;//在七牛云存储空间中的名字
                 *
                 *              public DefaultPutRet() {
                 *              }
                 *          }
                 *
                 */

                DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);

                String url = "";
                url = qiniuConfig.getPrefixUrl() + putRet.key;

                return url;
            } catch (IOException ex) {

                return null;
            }
        } catch (Exception e) {

            return null;
        }

    }
    
}

5.用knife4j测试一下

首先随便找一张图片(bushi)

在knife4j的界面中选择这个文件并上传

拿到返回的url地址

 在七牛云中我们保存的文件夹中看到了我们刚上传的图片

使用情景

做需要上传文件的相关业务时,我们可以把上传成功后文件的url保存到数据库中,在需要时直接查数据库获取文件的url,在前端做对应的回显即可。

*************************************************************************

私有桶的上传和下载

1.创建一个私有桶

2.修改相关配置

3.编写上传和下载的核心代码

控制器

@Tag(name="文件控制器",description = "基于七牛云实现文件上传和下载")
@RestController
@RequestMapping("file")
public class FileController {
    @Autowired
    private FileService fileService;

    @Operation(summary = "uploadFile",description = "基于七牛云上传文件")
    @PostMapping("/uploadFile")
    public Result uploadFile(MultipartFile file){
        String url = fileService.upload(file);
        if(url!=null){
            return new Result(Code.UPLOAD_SUCCESS,"文件上传成功",url);
        }
        return new Result(Code.UPLOAD_FAIL,"文件上传失败",null);
    }
    
    @Operation(summary = "downloadFile",description = "基于七牛云下载文件")
    @PostMapping("/downloadFile/{fileName}")
    public Result downloadFile(@PathVariable String fileName){
        String url = fileService.download(fileName);
        if(url!=null){
            return new Result(Code.DOWNLOAD_SUCCESS,"文件下载成功",url);
        }
        return new Result(Code.DOWNLOAD_FAIL,"文件下载失败",null);
    }

}

服务类

@Service
public class FileServiceImpl implements FileService {

    @Autowired
    private QiniuConfig qiniuConfig;

    /**
     *
     * @param file   要上传到七牛云的文件
     * @return url   上传后的文件的完整url
     */
    public String upload(MultipartFile file) {

        try {
            // 获取文件的名字   aaa.jpg
            String originalFilename = file.getOriginalFilename();

            //file扩展名 extendFileName    jpg
            String extendFileName = originalFilename.substring(originalFilename.lastIndexOf("."));

            String key =  UUID.randomUUID().toString().replace("-", "") + extendFileName;


            // 构造一个带指定 Region 对象的配置类
            Configuration zone = new Configuration(Zone.huanan());//我们刚开始选的是华南地区

            // 从 MultipartFile 直接获取输入流,避免先保存到本地再上传
            InputStream inputStream = file.getInputStream();

            //创建Auth对象,填写ak和sk
            Auth auth = Auth.create(qiniuConfig.getAccessKey(), qiniuConfig.getSecretKey());
            //获得上传凭证
            String upToken = auth.uploadToken(qiniuConfig.getBucket());
            System.out.println(upToken);
            //z3214mq2xG5w7-KHQk7oBiJC6zojrjmlVNcn0sai:oHRCCHPiB2YlJxxCYtDyVOb3lCs=:eyJzY29wZSI6ImdtZ3gyMDI0IiwiZGVhZGxpbmUiOjE3MjQ5Mjc2NjN9


            //隐藏了判空条件
            try (InputStream ignored = inputStream)
            {
                UploadManager uploadManager = new UploadManager(zone);//指定zone

                //上传图片到七牛云
                Response response = uploadManager.put(inputStream, key, upToken,null,null);

                DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);

                String url = "";
                url = qiniuConfig.getPrefixUrl() + putRet.key;

                return url;
            } catch (IOException ex) {
                return null;
            }
        } catch (Exception e) {
            return null;
        }

    }


    @Override
    public String download(String fileName) {
        String urlString = "";
        try {
            // domain   下载 domain, eg: qiniu.com【必须】
            // useHttps 是否使用 https【必须】
            // key      下载资源在七牛云存储的 key【必须】
            String domain = qiniuConfig.getPrefixUrl();
            //todo 需要修改domain
            DownloadUrl url = new DownloadUrl(domain, qiniuConfig.getUseHttps(), fileName);

            // 带有效期
            long expireInSeconds = 60;
            long deadline = System.currentTimeMillis() / 1000 + expireInSeconds;
            Auth auth = Auth.create(qiniuConfig.getAccessKey(), qiniuConfig.getSecretKey());
            urlString = url.buildURL(auth, deadline);
            System.out.println(urlString);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return urlString;
    }

}

4.测试

 注意这里的url的格式,带上了过期时间和token

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

给鼠标一个好看的指针特效 鼠标光标如何修改形状?

许多爱美的小伙伴们都想着如何给自己的电脑打扮一下&#xff0c;用各种各样的途径来美化我们的电脑。今天我们给大家分享一下&#xff0c;如何美化鼠标效果&#xff0c;给鼠标指针修改成一个非常好看的形状~ 一起来看几组鼠标的效果&#xff0c;小编我给大家做了个录屏&#x…

LuaJit分析(十一)去除string.dump函数

Lua脚本中的string.dump函数用于生成字节码文件&#xff0c;根据对 luajit -b命令的分析可以得出&#xff0c;最终dump出字节码文件都是使用的string.dump函数。 因此即使我们的指令顺序被打乱&#xff0c;通过loadfile系统调用&#xff0c;再通过string.dump调用&#xff0c;…

缓存解决方案。Redis 和 Amazon ElastiCache 比较

欢迎来到雲闪世界。Redis 和 Amazon ElastiCache 等缓存解决方案是通过将频繁访问的数据存储在内存中来提高应用程序性能的热门选择。让我们从实施简单性、性能、成本和维护方面对它们进行比较。 实施简单 设置 Redis 需要在基础设施或云实例上安装和配置 Redis 服务器。它可…

回归预测|基于CNN-LSTM-Attention结合Adaboost集成数据预测Matlab程序 多特征输入单输出

回归预测|基于CNN-LSTM-Attention结合Adaboost集成数据预测Matlab程序 多特征输入单输出 文章目录 前言回归预测|基于CNN-LSTM-Attention结合Adaboost集成数据预测Matlab程序 多特征输入单输出 一、CNN-LSTM-Attention-Adaboost模型**详细流程&#xff1a;****基本原理&#xf…

Golang | Leetcode Golang题解之第381题O(1)时间插入、删除和获取随机元素-允许重复

题目&#xff1a; 题解&#xff1a; type RandomizedCollection struct {idx map[int]map[int]struct{}nums []int }/** Initialize your data structure here. */ func Constructor() RandomizedCollection {return RandomizedCollection{idx: map[int]map[int]struct{}{},}…

服务器数据恢复—LeftHand存储中raid5阵列多块磁盘离线的数据恢复案例

LeftHand存储支持RAID5、RAID6、RAID10磁盘阵列&#xff0c;同时还支持卷快照&#xff0c;卷动态扩容等。下面简单聊一下LeftHand存储的结构和一个LeftHand p4500存储中磁盘阵列数据恢复案例。 服务端&#xff1a; 客户端&#xff1a; LeftHand存储结构&#xff1a; Lefthand存…

打架目标检测数据集 9000张 打架数据集 带标注voc yolo

本项目的目标是开发一个能够自动检测公共场所中打架行为的系统。该系统利用先进的计算机视觉技术和深度学习方法&#xff0c;在实时视频流或静态图像中准确地识别出打架行为&#xff0c;这对于维护公共安全至关重要。 技术栈 YOLOv8: 作为主要的目标检测框架&#xff0c;因其在…

基于my Batis优化图书管理系统(二)

4. 图书列表 添加图书之后, 跳转到图书列表⻚⾯, 并没有显⽰刚才添加的图书信息, 接下来我们来实现图 书列表 4.1 需求分析 当查询到我们的图书数据很多的时候&#xff0c;一个页可能存放不了&#xff0c;所以我们进行分页处理数据&#xff0c;并且分页进行查询&#xff1b;如…

最新视频合成后调优技术ExVideo模型部署

ExVideo是一种新型的视频合成模型后调优技术&#xff0c;由华东师范大学和阿里巴巴的研究人员共同开发。 ExVideo提出了一种新的后调优策略&#xff0c;无需对整个模型进行大规模重训&#xff0c;仅通过对模型中时序相关组件的微调&#xff0c;就能够显著增强其生成更长视频片…

【大模型系列篇】大语言模型架构分类和对比

在预训练语言模型时代&#xff0c;自然语言处理领域广泛采用了预训练(Pre-training) 微调(SFT)的范式&#xff0c; 并诞生了以 BERT 为代表的编码器&#xff08;Encoder-only&#xff09;架构、以 GPT 为代表的解码器&#xff08;Decoder-only&#xff09;架构和以 T5 为代表的…

关于springboot对接chatglm3-6b大模型的尝试

之前我们通过阿里提供的cloud ai对接了通义千问。cloud ai对接通义千问 那么接下来我们尝试一些别的模型看一下&#xff0c;其实这个文章主要是表达一种对接方式&#xff0c;其他的都大同小异。都可以依此方法进行处理。 一、明确模型参数 本次我们对接的理论支持来自于阿里云…

模型 DFEAS营销法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。需求触发&#xff0c;精准营销转化。 1 DFEAS营销法的应用 1.1 个性化健身应用的市场拓展策略 随着健康意识的增强&#xff0c;个性化健身应用市场迅速发展。一款名为“FitMyLife”的个性化健身应用…

FancyVideo

一、模型介绍 合成运动丰富且时间一致的视频仍然是人工智能领域的一项挑战&#xff0c;尤其是在处理较长的持续时间时。现有的文本到视频 (T2V) 模型通常采用空间交叉注意进行文本控制&#xff0c;等效地指导不同帧的生成而无需特定于帧的文本指导。因此&#xff0c;模型理解提…

经典算法之链表篇(二)

目录 一&#xff1a;重排链表&#xff08;LeetCode.143&#xff09; 二&#xff1a;删除链表的节点&#xff08;LCR 136. 删除链表的节点&#xff09; 三&#xff1a;K个一组反转链表&#xff08;LeetCode.25&#xff09; 有关经典算法链表的第一篇内容&#xff0c;可以查看我…

在线考试系统源码功能分析

在线考试系统源码的功能分析涵盖了多个关键方面&#xff0c;以确保系统能够满足教育机构和个人的需求。以下是一些常见的功能分析&#xff1a; 权限控制&#xff1a;系统通常支持多个角色&#xff0c;如教师、管理员和学生&#xff0c;并使用JWT等技术进行用户身份的合法性校验…

Leetcode JAVA刷刷站(101)对称二叉树

一、题目概述 二、思路方向 在Java中&#xff0c;要检查一个二叉树是否是轴对称的&#xff08;也称为镜像对称的&#xff09;&#xff0c;你可以通过递归地比较树的左子树和右子树是否镜像对称来实现。轴对称的二叉树意味着树的左子树和右子树关于根节点对称&#xff0c;即左子…

微信小程序:手机联调同一个网段无法找到本地接口

我们在开发微信小程序的时候&#xff0c;一般会启动本地服务器进行API连调&#xff0c;不过模拟器上面往往一些问题及细节发现不了&#xff0c;需要真机调试&#xff0c;结果调试的时候发现&#xff0c;不能访问到 localhost或者本机IP&#xff0c;也就访问不到本地接口&#x…

【HarmonyOS NEXT开发】鸿蒙开发环境准备,ArkTS基础语法入门

文章目录 鸿蒙开发环境准备&#xff0c;ArkTS基础语法入门大纲简介DevEco Studio简介运行环境要求 安装与配置开发工具下载Harmony OS 和 OpenHarmony 的区别Previewer汉化插件的配置 ArkTS基础快速入门1. 解释说明2. 变量与常量3. 变量命名规则4. 数组5. 函数定义函数调用函数…

Mini型LoRa DTU远距离无线传输“小体积大作为”

Mini型LoRa DTU&#xff08;数据传输单元&#xff09;CL61M凭借其小巧的体积、低功耗、远距离通信和高可靠性等特点&#xff0c;在远距离无线传输领域展现出了巨大的应用潜力。使RS485/232串口终端设备能够轻松实现十公里的远距离无线通信&#xff0c;适用于多种复杂环境&#…

(三)Kafka离线安装 - ZooKeeper开机自启

手动启动方式 一般通过指令手动来启动zookeeper的方法是&#xff0c;先进入到zookeeper的安装目录下的bin目录&#xff0c;然后执行启动指令。 cd /usr/local/zookeeper/zookeeper-3.8.4/bin/zkServer.sh start 停止指令 zkServer.sh stop 查看状态 zkServer.sh status 上…