【补充】文件存储方案

【补充】视频托管

  • 在处理静态文件(如视频、图片、压缩文件等)时

    • 通常的做法是将这些文件从项目的媒体文件夹(media folder)中分离出来
    • 以避免项目变得庞大且难以管理。
    • 取而代之的是使用第三方的文件托管平台来存储这些文件。
  • 以下是一些常见的第三方文件存储平台选项:

    • 七牛云:

      • 七牛云存储提供了可靠、可扩展且经济高效的云端对象存储服务,能够满足各种规模的文件存储需求。
    • 阿里云 OSS 存储:

      • 阿里云对象存储服务(Object Storage Service,简称 OSS)为您提供了海量、安全、低成本、高可靠的云存储服务,支持存储和处理大规模的非结构化数据。
  • 除了使用第三方存储平台,您还可以选择在自己公司内部搭建文件存储系统。

  • 下面是一些常见的文件存储搭建选项:

    • Ceph:

      • Ceph 是一个可靠的、高性能的分布式文件系统,具备自我修复、自动重平衡和数据备份等功能。

      • 它适用于大规模的分布式存储环境。

    • Minio:

      • Minio 是一个开源的对象存储服务器,兼容 Amazon S3 接口。

      • 它具有分布式、高性能和易于部署的特点,是搭建私有对象存储服务的不错选择。

    • FastDFS:

      • FastDFS 是一个轻量级的分布式文件系统,特别适用于存储大规模的较小文件。
      • 它采用高可用设计,并提供了快速的文件上传和下载服务。
      • FastDFS:https://zhuanlan.zhihu.com/p/372286804

【一】使用七牛云托管

【1】注册七牛云账号:

【2】选择文件存储服务 - Kodo:

  • 登录后,在七牛云控制台中,选择文件存储服务,即 Kodo。Kodo 是七牛云提供的对象存储服务,可用于存储各种类型的文件,包括视频、图片和其他静态文件。
  • 网址

【3】创建空间:

  • 在 Kodo 服务中,您需要创建一个空间(Bucket),这是存储文件的地方。每个空间相互隔离,您可以为不同的项目、应用或者不同的使用场景创建独立的空间。点击控制台上的“创建空间”按钮,按照提示输入空间名称、存储区域等相关信息,然后确认创建。

【4】手动上传视频:

  • 在成功创建空间后,您可以通过七牛云提供的上传功能手动上传视频文件。点击空间管理中的上传按钮,在弹出的文件选择对话框中选择您要上传的视频文件,并按照提示完成上传流程。

【二】Docker部署Minio容器

【1】Minio容器介绍

  • Minio是一个开源的对象存储服务器,使用Apache License v2.0开源协议。

    • 它提供了一个存储桶(bucket)的概念,类似于文件系统中的目录,用于存储对象文件。
    • Minio与亚马逊S3云存储服务兼容,使得它可以轻松地与现有的S3应用程序集成。
  • Minio的优势在于其简洁和高性能。

    • 它被设计成轻量级的,并且具有低延迟和高吞吐量的特点。
    • 这使得Minio非常适合存储大容量的非结构化数据,例如图像、视频、日志文件、备份数据以及容器或虚拟机镜像等。
    • 而且,Minio没有任何限制,一个对象文件可以是任意大小,从几KB到最大5TB不等。
  • Minio通过使用分布式架构来实现高可用性和冗余备份。

    • 您可以配置多个Minio服务器,形成一个分布式集群来确保数据的安全性和可靠性。
    • 此外,Minio还支持数据加密和访问控制,使您能够根据需要对数据进行保护和管理。
  • 总之,Minio是一个功能强大且易于使用的对象存储服务器,适用于各种场景,包括数据存储、数据备份、容器存储等。

    • 通过与亚马逊S3兼容的API,Minio能够轻松地与现有的应用程序集成,为您提供方便和高效的存储解决方案。

【2】寻找Minio镜像

  • Docker如果想安装软件 , 必须先到 Docker 镜像仓库下载镜像。

【3】下载Minio镜像

(1)下载最新版本镜像

docker pull minio/minio
  • 下载最新版Minio镜像

    • 其实此命令就等同于
    docker pull minio/minio:latest

(2)下载指定版本镜像

docker pull minio/minio:RELEASE.2022-06-20T23-13-45Z.fips

下载指定版本的Minio镜像 (xxx指具体版本号)

(3)下载过程

  • 镜像下载完成
Using default tag: latest latest: Pulling from minio/minio 0c10cd59e10e: Pull complete ee2351f734c9: Pull complete 6938b5623639: Pull complete 52c7cc767226: Pull complete 234b624c4f30: Pull complete 67f2303e832e: Pull complete Digest: sha256:d6369c50d12a201b8fe72458c97fba79a50980184440b1e2fe93634dbf0ef682 Status: Downloaded newer image for minio/minio:latest docker.io/minio/minio:latest
  • 查看镜像

    docker images
REPOSITORY TAG IMAGE ID CREATED SIZE minio/minio latest b28473c6b8d0 2 days ago 276MB

【4】创建目录

  • 一个用来存放配置,一个用来存储上传文件的目录
  • 启动前需要先创建Minio外部挂载的配置文件( /home/minio/config)和存储上传文件的目录( /home/minio/data)
mkdir -p /data/minio/config mkdir -p /data/minio/data
  • 查看是否存在
# cd /data # ls minio # cd minio # ls config data

【5】创建Minio容器并运行

  • 多行模式
docker run -p 9011:9011 -p 9010:9010 \ --name minio \ -d --restart=always \ -e "MINIO_ACCESS_KEY=dream" \ -e "MINIO_SECRET_KEY=dream521" \ -v /data/minio/data:/data \ -v /data/minio/config:/root/.minio \ minio/minio server \ /data --console-address ":9010" -address ":9011"
  • 9090端口指的是minio的客户端端口
  • MINIO_ACCESS_KEY :账号
  • MINIO_SECRET_KEY :密码(账号长度必须大于等于5,密码长度必须大于等于8位)
  • 配置文件路径要和上面的自定义路径一样
  • 存储文件路径要和上面的自定义路径一样
  • 单行模式
docker run -p 9010:9010 -p 9011:9011 --net=host --name minio -d --restart=always -e "MINIO_ACCESS_KEY=dream" -e "MINIO_SECRET_KEY=dream521" -v /data/minio/data:/data -v /data/minio/config:/root/.minio minio/minio server /data --console-address ":9010" -address ":9011"

【6】操作Minio

(1)登录页面

(2)登陆成功

(3)创建用户

  • 点击 Create User

  • 输入用户名和密码

  • 创建成功

(4)创建 Create Group

  • 点击创建组

  • 输入组的名字和组成员

  • 创建完成

(5)创建accessKey和secretKey

  • 点击 Create access key

  • 会自动生成

  • 点击Download for import

  • 文件名:credentials.json
  • 文件内容
{"url":"http://IP/api/v1/service-account-credentials","accessKey":"秘钥","secretKey":"秘钥","api":"s3v4","path":"auto"}
  • 以上内容是自动生成的,我填文字的部分都是自动生成的
  • IP:自己的服务器IP
  • 秘钥:上面自动生成的
  • 秘钥:上面自动生成的

(6)创建桶(Bucket)

  • 点击 Create Bucket

  • 输入桶的名字

  • 创建成功

(7)上传文件

  • 查看已创建的桶

  • 进入到已创建的桶内

  • 点击 Upload
    • 可以选择单文件/文件夹

  • 上传文件成功

  • 可以在这里查看桶的容量使用情况

【7】SDK操作

(1)相关链接

(2)Java 操作上传文件

  • maven依赖
#低版本的okhttp会报错提示 <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.0</version> </dependency> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.4.2</version> <exclusions> <exclusion> <artifactId>okhttp</artifactId> <groupId>com.squareup.okhttp3</groupId> </exclusion> </exclusions> </dependency>

  • 测试文件上传
import io.minio.BucketExistsArgs; import io.minio.MakeBucketArgs; import io.minio.MinioClient; import io.minio.UploadObjectArgs; import io.minio.errors.MinioException; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; public class FileUploader { public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeyException { try { // Create a minioClient with the MinIO server playground, its access key and secret key. MinioClient minioClient = MinioClient.builder() .endpoint("http://192.168.124.132:9000") .credentials("XO1JDovW2FTmGaBb", "uG6wMfylUnOVH5WzwxqnldOWw2dMshNX") .build(); // Make 'asiatrip' bucket if not exist. boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("public").build()); if (!found) { // Make a new bucket called 'asiatrip'. minioClient.makeBucket(MakeBucketArgs.builder().bucket("public").build()); } else { System.out.println("Bucket 'public' already exists."); } // Upload '/home/user/Photos/asiaphotos.zip' as object name 'asiaphotos-2015.zip' to bucket // 'asiatrip'. minioClient.uploadObject( UploadObjectArgs.builder() .bucket("public") .object("credentials.json") .filename("C:/Users/lai.huanxiong/Downloads/credentials.json") .build()); System.out.println("'C:/Users/lai.huanxiong/Downloads/credentials.json' is successfully uploaded as " + "object 'credentials.json' to bucket 'public'."); } catch (MinioException e) { System.out.println("Error occurred: " + e); System.out.println("HTTP trace: " + e.httpTrace()); } } }

  • 文件上传成功展示

(3)Python 操作上传文件

[1]最低要求

  • Python 3.7 或更高版本。

[2]安装第三方库

pip3 install minio
  • 下载源码
git clone https://github.com/minio/minio-py cd minio-py python setup.py install

[3]快速入门示例

  • 此示例程序连接到与 S3 兼容的对象存储服务器,在该服务器上创建一个存储桶,然后将文件上传到该存储桶。
  • 您需要以下项目才能连接到与 S3 兼容的对象存储服务器:
参数 描述
端点 指向 S3 服务的网址。
访问密钥 S3 服务中账户的访问密钥(也称为用户 ID)。
密钥 S3 服务中账户的私有密钥(也称为密码)。
  • 此示例使用 MinIO 服务器游乐场 https://play.min.io

  • 请随意使用此服务进行测试和开发。

  • file_uploader.py

from minio import Minio from minio.error import S3Error def main(): # Create a client with the MinIO server playground, its access key # and secret key. client = Minio( "play.min.io", access_key="Q3AM3UQ867SPQQA43P2F", secret_key="zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG", ) # Make 'asiatrip' bucket if not exist. found = client.bucket_exists("asiatrip") if not found: client.make_bucket("asiatrip") else: print("Bucket 'asiatrip' already exists") # Upload '/home/user/Photos/asiaphotos.zip' as object name # 'asiaphotos-2015.zip' to bucket 'asiatrip'. client.fput_object( "asiatrip", "asiaphotos-2015.zip", "/home/user/Photos/asiaphotos.zip", ) print( "'/home/user/Photos/asiaphotos.zip' is successfully uploaded as " "object 'asiaphotos-2015.zip' to bucket 'asiatrip'." ) if __name__ == "__main__": try: main() except S3Error as exc: print("error occurred.", exc)
  • 运行文件上传程序
$ python file_uploader.py '/home/user/Photos/asiaphotos.zip' is successfully uploaded as object 'asiaphotos-2015.zip' to bucket 'asiatrip'. $ mc ls play/asiatrip/ [2016-06-02 18:10:29 PDT] 82KiB asiaphotos-2015.zip

[4]自己测试案例

  • 安装第三方库
pip3 install minio
  • 编写程序
# -*-coding: Utf-8 -*- # @File : upload .py # author: Chimengmeng # blog_url : https://www.cnblogs.com/dream-ze/ # Time:2023/8/12 import os # 导入MinIO模块 from minio import Minio # 导入异常模块 from minio.error import S3Error def main(): # 创建MinIO客户端 使用 # access_key :客户端自动生成 # secret_key :客户端自动生成 client = Minio( # endpoint指定的是你Minio的远程IP及端口 endpoint="43.138.48.158:9011", # accesskey指定的是你的Minio服务器访问key # 默认值为minioadmin access_key="7FGId3bewvgBq75Upf0Q", # secret_key指定的是你登录时需要用的key,类似密码 # 默认值也是minioadmin secret_key="5wvGpsF9f058sSBq9A3XJ06qQezLFlKnSu0vKNkh", # secure指定是否以安全模式创建Minio连接 # 建议为False secure=False ) # 确保存在一个名为'testbucket'的存储桶 found = client.bucket_exists("testbucket") # 如果不存在则创建桶 if not found: client.make_bucket("testbucket") else: print("桶:>> 'testbucket' 已存在!") # 上传文件 # 使用with open打开目标文件 file_path = r'E:\Old Boy\luffy\luffyCity\scripts\test\MinioTest\001.jpg' with open(file_path, "rb") as file_data: # 使用os.path.getsize()获取目标文件的大小 bytes_length = os.path.getsize(file_path) # bucket_name:目标远程存储桶名,指定文件将被存储在哪个桶下。 # object_name:指定目标文件将在远程桶下以什么名字被存储。 # data:指定文件的I/O缓冲数据,这也是为什么我们用with open先读取文件了 # length:Minio需要在上传时指定文件的大小,它并不会自动计算文件的大小,因此需要我们在终端获取到文件的大小并作为参数传递给API。 client.put_object("testbucket", "001.jpg", file_data, bytes_length) print( "'001.jpg' 文件路径验证成功 " "文件:>> '001.jpg' 已上传至桶:>> 'testbucket'." ) # 使用client.presigned_get_object()函数获取一个文件对象的可分享URL。 url = client.presigned_get_object("testbucket", "001.jpg") print(url) if __name__ == "__main__": try: main() except S3Error as exc: print("捕获异常是:>>>", exc)
  • 运行显示结果
桶:>> 'testbucket' 已存在! '001.jpg' 文件路径验证成功 文件:>> '001.jpg' 已上传至桶:>> 'testbucket'. http://43.138.48.158:9011/testbucket/001.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=7FGId3bewvgBq75Upf0Q%2F20230812%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230812T064431Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=753a6e945353188001008eafc8901efbb25926e016e05346fea67585656fe23a
  • 桶内数据已上传
    • 并且可以通过返回的链接下载对应的文件

【三】使用Python代码调用Minio SDK 上传文件

【1】代码封装

def __init__(self, endpoint, access_key, secret_key, secure=False, bucket_name=None, policy=None): # IP:PORT self.endpoint = endpoint # 访问key self.access_key = access_key # 密钥 self.secret_key = secret_key # 是否使用https self.secure = secure self.bucket_name = bucket_name self.policy = policy

【二】腾讯云域名解析七牛云储存

【1】进入七牛云空间管理

  • 点击操作中的“域名”

【2】绑定域名

  • 域名配置这里输入您要绑定的域名
  • 建议是3级域名
  • 比如:huoyanshan.qiniou.26a.top
  • 项目.储存方.主域名

  • 输入后下拉到最下面,然后点击创建

【4】验证域名归属权

(1)域名解析

(2)点击添加记录

  • 根据七牛云要求的验证记录值进行添加解析并验证

  • 务必记录类型选择TXT

(3)开始验证

  • 添加完3分钟左右,可以尝试在七牛云后台点击验证

  • 验证成功以后根据提示配置CNAME

【5】配置CNAME

(1)查看七牛云

(2)腾讯云解析

  • 按七牛云给的CNAME值解析CNAME
  • 解析成功3分钟左右即可配置成功

【5】SSL配置

(1)七牛云域名管理

  • 进入七牛云-控制台-CND -域名管理
  • 选择刚配置的域名
  • 点击操作中的配置

(2)HTTPS配置

  • 下拉找到HTTPS配置

  • 然后点击修改配置,打开HTTPS配置开关

(3)申请证书

  • 然后建议选择免费证书,然后同意七牛云申请免费证书-点击确认
  • 如果您业务需求比较高,建议购买收费商业证书上传

  • 确认后需要输入密码,请输入密码
  • 输入密码后大约15分钟即可配置完成。

  • 后续需要停用HTTPS服务请点击这里

【补充】域名备案

【1】将项目放到互联网上给别人使用:

  • 在将项目放到互联网上之前,您需要确保您的项目已经完成开发并经过测试,以确保它的正常运行和稳定性。
  • 接下来,您需要选择一个服务器提供商或云服务提供商来托管您的项目。这些服务商通常提供各种不同的服务器类型和价格方案供您选择。
  • 根据您的项目需求和预算,选择适合您的服务器,并将您的项目文件上传至服务器。
  • 您还需要配置服务器以使您的项目正确运行,并确保服务器具备足够的安全性,例如设置防火墙、身份验证等。

【2】购买域名:

  • 域名是您在互联网上标识和访问您的项目的唯一名称。购买域名的过程比较简单,您可以通过许多域名注册商进行购买。
  • 选择一个可信赖和信誉良好的域名注册商,在其网站上搜索您所需的域名,看是否可用。
  • 如果您的域名可用,您可以按照注册商的指引填写必要的信息,并支付相关费用即可完成购买。

【3】备案工信部:

  • 备案是指向工业和信息化部(通常称为工信部)提交必要的信息,以便在中国大陆地区部署网站或应用程序。备案过程是因符合相关法规而设置的。
  • 在备案之前,您需要确保您已经购买了一个中国域名(以.cn、.com.cn、.net.cn等后缀结尾的域名)。
  • 您需要联系您选择的域名注册商,了解他们是否能够提供备案服务,并收集必要的备案材料,例如公司营业执照、服务器租赁合同等。
  • 将备案材料提交给域名注册商进行审核,注册商会协助您完成备案申请,将材料提交给工信部审批。
  • 一旦备案审核通过,您将获得一个备案号码,并可以在中国大陆地区正式部署您的项目。

【4】项目在 1**.28.11.11 :

  • 您提到的 "1**.28.11.11" 可能是指您的项目所在的服务器 IP 地址。
  • 通过该 IP 地址,您可以访问、管理和配置您的项目,例如上传文件、设置数据库等。具体的操作方法取决于你使用的服务器和操作系统。

【5】域名解析:

  • 域名解析是将域名转换为IP地址的过程,使得用户可以通过域名访问您的项目。
  • 您需要在域名注册商提供的控制面板或管理界面中,进行域名解析的相关设置,将您的域名指向您的服务器 IP 地址。
  • 域名解析通常包括添加A记录或CNAME记录,具体方法和步骤可能因不同的域名注册商而有所不同。
  • 域名解析生效过程中可能需要一些时间(通常为数小时),这是因为DNS解析需要时间来传播更新。

__EOF__

本文作者Chimengmeng
本文链接https://www.cnblogs.com/dream-ze/p/17642793.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Chimengmeng  阅读(101)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
点击右上角即可分享
微信分享提示