图片云存储-七牛云

news/2025/11/27 2:58:26/文章来源:https://www.cnblogs.com/ajing2018/p/19275096

图片云存储-七牛云

一、介绍

在实际开发中,我们会有很多处理不同功能的服务器。例如:

 应用服务器:负责部署我们的应用

 数据库服务器:运行我们的数据库

 文件服务器:负责存储用户上传文件的服务器

  image

  分服务器处理的目的是让服务器各司其职,从而提高我们项目的运行效率。

 常见的图片存储方案:

  方案一:使用nginx搭建图片服务器

  方案二:使用开源的分布式文件存储系统,例如Fastdfs、HDFS等

  方案三:使用云存储,例如阿里云、七牛云等

二、七牛云存储

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

官网:https://www.qiniu.com/

通过七牛云官网介绍我们可以知道其提供了多种服务,我们主要使用的是七牛云提供的对象存储服务来 存储图片。

1. 注册、登录

 要使用七牛云的服务,首先需要注册成为会员。地址:https://portal.qiniu.com/signup

  image

 注册完成后就可以使用刚刚注册的邮箱和密码登录到七牛云:

  image

 登录成功后点击页面右上角管理控制台:

  image

 注意:登录成功后还需要进行实名认证才能进行相关操作。

2. 新建存储空间

 要进行图片存储,我们需要在七牛云管理控制台新建存储空间。点击管理控制台首页对象存储下的立即 添加按钮,页面跳转到新建存储空间页面:

  image

 可以创建多个存储空间,各个存储空间是相互独立的。

3. 查看存储空间信息

 存储空间创建后,会在左侧的存储空间列表菜单中展示创建的存储空间名称,点击存储空间名称可以查 看当前存储空间的相关信息

4. 开发者中心

 image

 点击对象存储,跳转到对象存储开发页面,地址:https://developer.qiniu.com/kodo

  image

 七牛云提供了多种方式操作对象存储服务,本项目采用Java SDK方式,地址:https://developer.qiniu. com/kodo/sdk/1239/java 

  image

<dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>7.2.0</version>
</dependency>

 

5. 鉴权

 Java SDK的所有的功能,都需要合法的授权。

 授权凭证的签算需要七牛账号下的一对有效的Access Key和Secret Key,这对密钥可以在七牛云管理控制台的个人中心(https://portal.qiniu.com/user/key)获 得,如下图:

  image

6. Java SDK操作七牛云

 使用七牛云提供的Java SDK完成图片上传和删除,我们可以参考官方提供的例子。

    //使用七牛云提供的SDK实现将本地图片上传到七牛云服务器@Testpublic void test1(){//构造一个带指定 Region 对象的配置类Configuration cfg = new Configuration(Region.region0());cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本//...其他参数参考类注释UploadManager uploadManager = new UploadManager(cfg);//...生成上传凭证,然后准备上传String accessKey = "fCdzEk43Z_VlZkqsg9aXzAFgWbhWrI--RxXSQ-03";String secretKey = "wFpXlGEVr619xF1HjT2hCMwl1ShyOdy2PIEPG7UO";String bucket = "health-new-1";//如果是Windows情况下,格式是 D:\\qiniu\\test.png,/home/qiniu/test.pngString localFilePath = "C:\\workFiles\\test.png";//默认不指定key的情况下,以文件内容的hash值作为文件名,不带.png;指定后上传到服务器的文件名就是keyString key = "abc.png";Auth auth = Auth.create(accessKey, secretKey);String upToken = auth.uploadToken(bucket);try {Response response = uploadManager.put(localFilePath, key, upToken);//解析上传成功的结果DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);System.out.println(response);System.out.println(putRet.key);//abc.pngSystem.out.println(putRet.hash);} 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) {}}}}
    //删除七牛云中的图片@Testpublic void test2(){//构造一个带指定 Region 对象的配置类Configuration cfg = new Configuration(Region.region0());//...其他参数参考类注释String accessKey = "fCdzEk43Z_VlZkqsg9aXzAFgWbhWrI--RxXSQ-03";String secretKey = "wFpXlGEVr619xF1HjT2hCMwl1ShyOdy2PIEPG7UO";String bucket = "health-new-1";String key = "abc.png";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());}}

7. 封装工具类

 为了方便操作七牛云存储服务,我们可以将官方提供的案例简单改造成一个工具类,在我们的项目中直接使用此工具类来操作就可以:

package com.itheima.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;/*** 七牛云工具类*/
public class QiniuUtils {//空间存储为公共读//...生成上传凭证,然后准备上传public static String accessKey = "fCdzEk43Z_VlZkqsg9aXzAFgWbhWrI--RxXSQ-03";public static String secretKey = "wFpXlGEVr619xF1HjT2hCMwl1ShyOdy2PIEPG7UO";public static String bucket = "health-new-1";public static void upload2Qiniu(String filePath,String fileName){//构造一个带指定 Region 对象的配置类Configuration cfg = new Configuration(Region.region0());cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本//...其他参数参考类注释UploadManager uploadManager = new UploadManager(cfg);//如果是Windows情况下,格式是 D:\\qiniu\\test.png
//        String localFilePath = "/home/qiniu/test.png";//默认不指定key的情况下,以文件内容的hash值作为文件名,企业中不指定名字,因为要保证不重名
//        String key = "abc.png";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);System.out.println(putRet.key);System.out.println(putRet.hash);} 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) {}}}}//上传文件public static void upload2Qiniu(byte[] bytes, String fileName){//构造一个带指定Zone对象的配置类Configuration cfg = new Configuration(Region.region0());//...其他参数参考类注释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);} catch (QiniuException ex) {Response r = ex.response;System.err.println(r.toString());try {System.err.println(r.bodyString());} catch (QiniuException ex2) {//ignore}}}//删除文件public static void deleteFileFromQiniu(String fileName){//构造一个带指定 Region 对象的配置类Configuration cfg = new Configuration(Region.region0());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());}}
}

 

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

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

相关文章

彻底搞懂 Raft 算法:为“被理解”而生的分布式共识

彻底搞懂 Raft 算法:为“被理解”而生的分布式共识彻底搞懂 Raft 算法:为“被理解”而生的分布式共识 在分布式系统的世界里,共识(Consensus)是一个核心难题:如何让一堆机器对某个值(比如数据记录)达成一致? …

龙哥量化:初版简单的通达信公式回测案例_macd趋势策略收益曲线,展示在通达信的主副图(展示部分代码)

3、函数buy,sell不能指定手数,只能在界面设置。 4、不识别第二个参数价格,所以, 你用上图中的10个价格之外的价格,在回测系统不起作用,比如实时突破压力线,代码中用压力线的价格成交,BUY(突破, 压力线),实际…

代码随想录算法训练营第三章 哈希表part02

代码随想录算法训练营第三章 哈希表part02第454题.四数相加II leetcode链接:https://leetcode.cn/problems/4sum-ii/description/ 题目描述:给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, …

AI:情绪冲动和阴性症状有什么关系

情感症状 和情绪冲动和阴性症状有什么关系 这个问题非常深刻,触及了精神病理学的核心。情感症状、情绪冲动与阴性症状的关系,与它们和阳性症状的关系完全不同,甚至可以说是相反的。 简单来说:阳性症状是正常功能的…

龙哥量化:简单的通达信公式回测案例_macd趋势策略收益曲线,展示在通达信的主副图(展示部分代码)

3、函数buy,sell不能指定手数,只能在界面设置。 4、不识别第二个参数价格,所以, 你用上图中的10个价格之外的价格,在回测系统不起作用,比如实时突破压力线,代码中用压力线的价格成交,BUY(突破, 压力线),实际…

光缆地图网站

光缆地图网站几个全球公认最权威、最好用的光缆地图网站,各有特色: 1. 行业标准级:TeleGeography Submarine Cable Map 这是全球电信行业最权威的数据来源,也是 UI 做得最好看的。网址:https://www.submarinecabl…

AE表达式

--本篇导航--如何使用表达式(打开删除,查看图形,错误)表达式的数组、赋值输入表达式、优先级一些常用的表达式(value,time,index,wiggle,random,loopOut,Math,if…else)表达式控制一些现成的表达式(可以…

2025 Xhorse XDTPM1EN Universal Programmable TPMS Sensor: Supports 315/433MHz Key Tool Max Pro/MIDI

The 2025 Xhorse XDTPM1EN TPMS Sensor: Solving Your Tire Pressure Monitoring Challenges Problem Identification: The Frustrations of Traditional TPMS Sensors For European and American automotive professi…

2025年金蝶ERP服务商实施能力强、服务好——上海宝蝶深耕金蝶ERP管理系统、金蝶财务软件

随着企业数字化转型的加速,选择一款优秀的ERP系统是第一步,而找到一个具备超强实施能力的服务商,才是项目成功的关键。金蝶ERP作为市场主流选择,其代理商数量众多,但实施交付的专业度、成功率和行业适配性却天差地…

【论文阅读】DeltaLag: Learning Dynamic Lead-Lag Patterns in Financial Markets

【论文阅读】DeltaLag: Learning Dynamic Lead-Lag Patterns in Financial Markets在小红书上刷到的,之前没见过 lead-lag effect。这里算是头一次学习。 lead-lag effect 讲了一个简单的故事,例如 yubai 说一般 btc…

Xhorse XDTPM1EN Universal Programmable TPMS Sensor 4pcs/lot – 315/433MHz for Key Tool Max Pro/MIDI

The TPMS Challenge: Safety, Reliability, and Compliance at Stake In the world of automotive maintenance, tire pressure monitoring systems (TPMS) are non-negotiable for safety, legal compliance, and veh…

AI元人文:从价值对齐到价值共生的范式革命,及其在社会治理中的实践验证

AI元人文:从价值对齐到价值共生的范式革命,及其在社会治理中的实践验证 摘要: 本文旨在阐述“AI元人文”这一理论体系如何完成从哲学构想(“描述的哲学”)到实践方法论(“生成的语法”)的关键跃迁。我们通过一个…

深入解剖 Redis 分布式锁:从 SETNX 到 Redlock 的演进之路

深入解剖 Redis 分布式锁:从 SETNX 到 Redlock 的演进之路深入解剖 Redis 分布式锁:从 SETNX 到 Redlock 的演进之路摘要:在微服务与分布式架构中,“如何防止资源被并发抢占”是一个永恒的话题。从秒杀扣库存到定时…

闲话 25.11.26

那些你不要的:一道码力为主,没啥数学的 poly 题题解闲话 ZJUPH 恶心死我了。puzzle hunt 不好玩 😭 [数据删除] 敬请期待赛后 write-up。能完赛吗? 怎么快一个月没写鲜花了 /jk 正好投了一个题,写一下鲜花,顺便…

oop-实验4 - fg

task1 GradeCalc.hpp1 #pragma once2 3 #include<vector>4 #include<array>5 #include<string>6 7 class GradeCalc{8 public:9 GradeCalc(const std::string &cname); 10 void input(i…

揭开 Kafka 水位线的秘密:深度解析 LEO 与 HW 的同步机制

揭开 Kafka 水位线的秘密:深度解析 LEO 与 HW 的同步机制揭开 Kafka 水位线的秘密:深度解析 LEO 与 HW 的同步机制摘要:在分布式存储中,数据复制是保证高可用的核心。但你是否想过:Follower 是怎么把数据从 Leade…

INFINI Labs 产品更新 - Coco AI v0.9 与 Easysearch v2.0 全新功能上线,全面支持 GitLab 合并请求(MR)自动 AI Review

此次更新主要包括:Coco AI v0.9 全面支持 GitLab 合并请求(MR)自动 AI Review,并重构为插件流水线架构,新增 Neo4j、MongoDB 等 10+ 数据源连接器,开启“AI+开发”协同新范式;Easysearch v2.0 正式发布,内置轻…

newDay23

1.今天好好把javaweb弄了一遍,终于是实现了所有要求的功能,然后就是团员的事也弄了半天 2.明天再熟悉熟悉javaweb,争取快速过关 3.今天没啥问题

【C语言】条件编译时谨慎使用枚举值

简短不看版: 关键原则预处理器只认识 #define 宏在需要计算的地方(#if, #elif):所有标识符必须有数值未定义的标识符被当作0 枚举类型在编译阶段才被处理在条件编译 (#if, #elif) 中必须使用宏定义,不能使用枚举值…

[源码系列:手写Spring] AOP第二节:JDK动态代理 - 当AOP遇见动态代理的浪漫邂逅

"在AI可以自动生成代码的今天,为什么还要读源码?因为理解原理才能让我们从代码的使用者变成创造者!"最近AI的崛起确实让技术圈发生了翻天覆地的变化,博主之前的源码解析栏目也因此沉寂了一段时间。不过,…