【补充】文件存储方案
【补充】视频托管
-
在处理静态文件(如视频、图片、压缩文件等)时
- 通常的做法是将这些文件从项目的媒体文件夹(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镜像
【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
-
登陆用户名:dream
-
登陆密码:dream521
(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)域名解析
- 然后进入腾讯域名域名管理中心,我的域名解析页面
- https://console.cloud.tencent.com/cns
(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解析需要时间来传播更新。
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17642793.html