图片存储方案-七牛云存储

news2025/2/28 19:43:51

1.引语

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

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

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

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

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

常见的图片存储方案:

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

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

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

2.操作

通过七牛云提供的开发者中心学习如何操作七牛云服务,地址:七牛开发者中心

选择对象存储开发手册,采用Java SDK方式

安装

安装 Maven 的插件:The Maven Integration for Eclipse

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

鉴权

Java SDK的所有的功能,都需要合法的授权。授权凭证的签算需要七牛账号下的一对有效的Access KeySecret Key

3.Java SDK操作七牛云

新建测试类,使用七牛云提供的SDK方法实现将本地图片上传到七牛云服务器

注意导入的依赖和包需要是七牛云的

将官方文档的代码粘贴修改相关参数

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
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.junit.Test;

public class QiNiuTest {
    //使用七牛云提供的SDK方法实现将本地图片上传到七牛云服务器
    @Test
    public void test1(){
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.region2());//使用华南机房
        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
//...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
        String accessKey = "YLRQlxIU5IyLEGSbhFt-hAYKvGY0_zNk_eABhM8t";
        String secretKey = "eswtzJogA9qDSne9Z9uZM8Kt8QNS0AYPNS971dxX";
        String bucket = "itcastheallth-sapce-01";
//如果是Windows情况下,格式是 D:\\qiniu\\test.png
        String localFilePath = "C:\\Users\\LuMengyun\\Desktop\\资料-传智健康项目\\day04\\资源\\图片资源\\03a36073-a140-4942-9b9b-712cecb144901.jpg";
//默认不指定key的情况下,以文件内容的hash值作为文件名
        String key = "null";
        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(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
            }
        }
    }
}

新建测试类,测试删除七牛云服务器中的图片

@Test
    public void test2(){
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.region2());
//...其他参数参考类注释
        String accessKey = "YLRQlxIU5IyLEGSbhFt-hAYKvGY0_zNk_eABhM8t";
        String secretKey = "eswtzJogA9qDSne9Z9uZM8Kt8QNS0AYPNS971dxX";
        String bucket = "itcastheallth-sapce-01";
        String key = "abc.jpg";
        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());
        }
    }

4.封装,方便使用

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

如果Gson爆红显示不能找到此符号,在pom文件中添加Gson的依赖,刷新即可

package com.itheima.utils;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
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 java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * 七牛云工具类
 */
public class QiniuUtils {
    public  static String accessKey = "YLRQlxIU5IyLEGSbhFt-hAYKvGY0_zNk_eABhM8t";
    public  static String secretKey = "eswtzJogA9qDSne9Z9uZM8Kt8QNS0AYPNS971dxX";
    public  static String bucket = "itcastheallth-sapce-01";

    public static void upload2Qiniu(String filePath,String fileName){
        //构造一个带指定Zone对象的配置类
        Configuration cfg = new Configuration(Region.region2());//使用华南机房
        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        //...生成上传凭证,然后准备上传
        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) {
            Response r = ex.response;
            System.err.println(r.toString());
            try {
                System.err.println(r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
        }
    }

    //上传文件
    public static void upload2Qiniu(byte[] bytes, String fileName){
        //构造一个带指定Zone对象的配置类
        Configuration cfg = new Configuration(Region.region2());//使用华南机房
        //...其他参数参考类注释
        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){
        //构造一个带指定Zone对象的配置类
        Configuration cfg = new Configuration(Zone.zone0());
        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.coloradmin.cn/o/435253.html

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

相关文章

tail:查看日志命令工具

文章目录 1. Windows下tail查看日志命令工具下载、使用方法2. baretail【windows端替代tail的工具】3. Tail4win【windows端替代tail的工具】4. MobaXterm【windows端替代tail的工具】5. tail 命令介绍 1. Windows下tail查看日志命令工具下载、使用方法 tail工具下载 链接&am…

中文改写神器下载-中文改写神器

自动文章生成器 随着人工智能技术的快速发展&#xff0c;自动文章生成器已经成为了一个越来越流行的营销推广工具。这种工具可以根据您提供的关键词和主题&#xff0c;在几秒钟之内生成高质量的文章&#xff0c;为企业加快文章产出速度&#xff0c;提高品牌知名度提供了优秀的…

C语言CRC-16 MAXIM格式校验函数

C语言CRC-16 MAXIM格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同厂家通过对输入…

android studio APP工程的项目结构说明

目录 1.APP工程的项目结构图 2.功能说明 2.1app 2.2Gradle Scripts 1.APP工程的项目结构图 2.功能说明 该项目下两个分类&#xff1a;一个是app&#xff08;代表app模块&#xff09;;另一个是Gradle Scripts。 2.1app app下面有3个子目录&#xff0c;功能如下&#xff1a;…

代码随想录之动态规划(力扣题号)

62 不同路径 很简单的dp class Solution {public int uniquePaths(int m, int n) {//58-02int[][] dp new int[m][n];//初始化for(int i 0;i<m;i){dp[i][0] 1;}for(int i 0;i<n;i){dp[0][i] 1;}for(int i1;i<m;i){for(int j 1;j<n;j){dp[i][j] dp[i-1][j]d…

开发小程序需要多少钱

开发小程序是如今网络世界中的一项重要活动&#xff0c;越来越多的企业和个人开始意识到通过开发小程序来提高自己的品牌价值和商业利益。那么&#xff0c;开发小程序需要多少钱呢&#xff1f; 首先&#xff0c;我们需要明确几个概念&#xff1a;小程序开发的成本通常包括以下…

kubespray-offline 下载并离线部署 kubernetes 自定义版本

kubespray-offline v2.21.0-0 默认部署 kubernetes 版本为 v1.25.6 我们以自定义部署 kubernetes 版本 v1.24.10为例。 下载&#xff1a;https://github.com/tmurakam/kubespray-offline/releases/tag/v2.21.0-0 unzip v2.21.0-0.zip cd kubespray-offline-2.21.0-0在下载介…

网络性能定位

根据tcp协议进行分析 目录 一、SYN_RECV阶段 1.1 确定半连接队列是否有丢包&#xff1a; 1.2 确定全连接队列是否有丢包现象 二、close_wait 三、TIME_WAIT ​ 一、SYN_RECV阶段 内核在监听套接字的时候&#xff0c;在三次握手时&#xff0c;会创建两个队列&#xff0c;在…

求解:使用Antv x6引入插件出现‘ToolItem’问题

一、前言 救救孩子&#xff0c;被困扰一周多了。 二、问题概述 2023年发布了antV X6的2.*版本&#xff0c;发现使用过程中会出现很多错误。 首先&#xff0c;个人使用的框架是Vue3&#xff0c;感觉有可能会是兼容性问题&#xff0c;但是有一个同事的电脑上是可以正常运行的。…

【C语言】基础语法2:运算符和表达式

❤️‍&#x1f525;前情提要❤️‍&#x1f525;   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图&#xff08;结束换链接&#xff09;并免费提供给大家学习&#xff0c;希望大家纠错指正。本专栏将以基础出发&#xff0c;在之后的教程中将会不断…

【历史上的今天】4 月 19 日:摩尔定律被提出;微软发布 Pocket PC;第一个 FORTRAN 程序开始运行

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 4 月 19 日&#xff0c;在 1918 年的今天&#xff0c;克利福德贝里&#xff08;Clifford Berry&#xff09;出生。他是世界上第一台电子数字计算设备 Atanasof…

springboot中记录链路日志traceId

一 相关概念 在分布式服务架构下&#xff0c;一个 Web 请求从网关流入&#xff0c;有可能会调用多个服务对请求进行处理&#xff0c;拿到最终结果。在这个过程中每个服务之间的通信又是单独的网络请求&#xff0c;无论请求流经的哪个服务除了故障或者处理过慢都会对前端造成影…

基于PCA和NSST算法联合实现红外与可见光图像融合的Matlab仿真(完整源码+35组数据集)

以下是一个使用PCA和NSST算法实现红外与可见光图像融合的Matlab仿真完整源码。源码中只需修改红外图像&#xff08;IR.bmp&#xff09;和可见光图像&#xff08;VI.bmp&#xff09;名字即可 文章目录 效果展示数据集展示步骤说明完整源码下载地址 效果展示 最终融合效果展示&am…

cifar-10数据集+ResNet50

CIFAR-10-ObjectRecognition 作为一个古老年代的数据集&#xff0c;用ResNet来练一下手也是不错的。 比赛链接&#xff1a;CIFAR-10 - Object Recognition in Images | Kaggle 1. 预设置处理 创建各类超参数&#xff0c;其中如果是在Kaggle上训练的话batch_size是可以达到40…

安全狗深度参与编写《数据安全产品与服务观察报告》发布!

4月11日&#xff0c;由中国通信标准化协会联合数据安全推进计划主办的《数据安全产品与服务观察报告》发布会在北京顺利开展。 作为国内云原生安全领导厂商&#xff0c;安全狗也参与了数据安全推进计划《数据安全产品与服务观察报告》撰写。 此次活动针对数据安全产业、技术、…

排序算法合集(1)

前言&#xff1a; 今天我们正式开始讲述算法中的排序。排序算法是我们十分重要的算法&#xff0c;为什么呢&#xff1f; 排序是在各种情况下都非常重要的&#xff0c;无论是在人类社会还是在计算机科学中。以下是一些排序的重要性&#xff1a; 数据分析&#xff1a;在数据分析…

多连接数据库管理Navicat Premium 中文

Navicat Premium 是一款强大的数据库管理工具&#xff0c;它支持多种关系型数据库&#xff0c;包括 MySQL、MariaDB、Oracle、SQL Server、PostgreSQL 等等。 以下是 Navicat Premium 的一些主要功能&#xff1a; 连接管理&#xff1a;可以在一个用户界面中同时连接到多个数据库…

HCIP-6.7BGP的路径选择

BGP的路径选择 1、BGP路径属性1.1、路由选择1.1.1、BGP路由选择过程1.1.2、BGP选路参数2、BGP的路由策略2.1、Preferred-Value相当权重weight2.2、local-preference本地优先级2.3、AS_PATH经过的AS号 不常用2.4、Origin起源属性修改2.5、MED多出口鉴别器3、BGP非策略性选路原则…

【C++】右值引用(极详细版)

在讲右值引用之前&#xff0c;我们要了解什么是右值&#xff1f;那提到右值&#xff0c;就会想到左值&#xff0c;那左值又是什么呢&#xff1f; 我们接下来一起学习&#xff01; 目录 1.左值引用和右值引用 1.左值和右值的概念 2.左值引用和右值引用的概念 2.左值引用和右…

C++linux高并发服务器项目实践 day2

Clinux高并发服务器项目实践 day2 静态库的制作静态库命名规则静态库的制作 动态库的制作命名规则制作使用动态库与静态库的区别解决动态库连接失败问题静态库和动态库的对比静态库的优缺点动态库的优缺点 Makefile什么是MakefileMakefile文件命名和规则Makefile的使用工作原理…