【补充】文件存储方案

【补充】视频托管

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

    • 通常的做法是将这些文件从项目的媒体文件夹(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解析需要时间来传播更新。
posted @ 2023-08-19 17:43  Chimengmeng  阅读(79)  评论(0编辑  收藏  举报