当前位置: 首页 > news >正文

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

准备工作

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-KHQk7oBiJC6sbjrjmlVNai0saisecretKey: _wys_Vf2RWpZqG9Hnlq32lQ17wvULnHeJSIjnGezbucket: gmgx2024prefixUrl: 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 {@Autowiredprivate 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 {@Autowiredprivate QiniuConfig qiniuConfig;/*** * @param file   要上传到七牛云的文件* @return url   上传后的文件的完整url*/public String upload(MultipartFile file) {try {// 获取文件的名字   aaa.jpgString originalFilename = file.getOriginalFilename();//file扩展名 extendFileName    jpgString extendFileName = originalFilename.substring(originalFilename.lastIndexOf("."));// 默认不指定key的情况下,以文件内容的hash值作为文件名 时间日期前缀LocalDate currentDate = LocalDate.now();DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd/");// todo:构建新的文件名    2024/8/29/一个uuid.jpgString key = currentDate.format(formatter) + UUID.randomUUID().toString().replace("-", "") + extendFileName;// 构造一个带指定 Region 对象的配置类Configuration zone = new Configuration(Zone.huanan());//我们刚开始选的是华南地区// 从 MultipartFile 直接获取输入流,避免先保存到本地再上传InputStream inputStream = file.getInputStream();//创建Auth对象,填写ak和skAuth 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 {@Autowiredprivate 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 {@Autowiredprivate QiniuConfig qiniuConfig;/**** @param file   要上传到七牛云的文件* @return url   上传后的文件的完整url*/public String upload(MultipartFile file) {try {// 获取文件的名字   aaa.jpgString originalFilename = file.getOriginalFilename();//file扩展名 extendFileName    jpgString 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和skAuth 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;}}@Overridepublic String download(String fileName) {String urlString = "";try {// domain   下载 domain, eg: qiniu.com【必须】// useHttps 是否使用 https【必须】// key      下载资源在七牛云存储的 key【必须】String domain = qiniuConfig.getPrefixUrl();//todo 需要修改domainDownloadUrl 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

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【数据库】两个集群数据实现同步方案
  • Node.js-身份证号实名认证-小程序实名认证接口集成方法
  • C语言中的预处理器字符串化与拼接操作符:底层原理及实现细节
  • 谷歌发布新AI GameNGen:AI也能实时生成游戏画面!
  • C++ day3
  • OpenStack创建云主机——超级详细步骤
  • Java的IO模型详解-BIO,NIO,AIO
  • Java并发编程(21)—— CurrentHashMap源码分析
  • redis集群部署
  • 字符串的内存存储
  • 使用Python+docx+sqlite3将Word表格内容写入sqlite表中
  • 区块链入门
  • Postman注册使用
  • 七、Centos安装LDAP--Docker版--已失败
  • 探索分析文档布局,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建大规模文档数据集DocLayNet场景下文档图像布局智能检测分析识别系统
  • JS 中的深拷贝与浅拷贝
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • java中的hashCode
  • jdbc就是这么简单
  • js递归,无限分级树形折叠菜单
  • node入门
  • React-Native - 收藏集 - 掘金
  • Sequelize 中文文档 v4 - Getting started - 入门
  • spring学习第二天
  • vue-router的history模式发布配置
  • vue--为什么data属性必须是一个函数
  • Vultr 教程目录
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 如何在GitHub上创建个人博客
  • 入口文件开始,分析Vue源码实现
  • 小程序01:wepy框架整合iview webapp UI
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 移动端高清、多屏适配方案
  • ​2021半年盘点,不想你错过的重磅新书
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $jQuery 重写Alert样式方法
  • (02)vite环境变量配置
  • (a /b)*c的值
  • (笔试题)分解质因式
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (一) storm的集群安装与配置
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET 8 跨平台高性能边缘采集网关
  • .net core 6 集成和使用 mongodb
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比