Laravel中使用MinIO进行文件操作及ZIP解压

Laravel中使用MinIO进行文件操作及ZIP解压指南

介绍

在本指南中,我们将详细介绍如何在laravel框架中操作minio,包含方法有:桶列表,创建桶,修改桶,上传文件,删除文件,生成直传链接,解压zip的php脚本

docker布署单节点单磁盘的MinIO服务

1.拉取MinIO最新稳定镜像
shell 复制代码
docker pull quay.io/minio/minio
2.创建环境变量文件
text 复制代码
# MINIO_ROOT_USER and MINIO_ROOT_PASSWORD sets the root account for the MinIO server.
# This user has unrestricted permissions to perform S3 and administrative API operations on any resource in the deployment.
# Omit to use the default values 'minioadmin:minioadmin'.
# MinIO recommends setting non-default values as a best practice, regardless of environment

MINIO_ROOT_USER=myminioadmin
MINIO_ROOT_PASSWORD=minio-secret-key-change-me

# MINIO_VOLUMES sets the storage volume or path to use for the MinIO server.

MINIO_VOLUMES="/mnt/data"

# MINIO_OPTS sets any additional commandline options to pass to the MinIO server.
# 例如, `--console-address :9001` sets the MinIO Console listen port
MINIO_OPTS="--console-address :9001"

# MINIO_SERVER_URL sets the hostname of the local machine for use with the MinIO Server
# MinIO assumes your network control plane can correctly resolve this hostname to the local machine

# Uncomment the following line and replace the value with the correct hostname for the local machine and port for the MinIO server (9000 by default).

#MINIO_SERVER_URL="http://minio.example.net:9000"
3.创建并运行容器
shell 复制代码
docker run -dt                                  \
  -p 9000:9000 -p 9001:9001                     \
  -v PATH:/mnt/data                             \
  -v /etc/default/minio:/etc/config.env         \
  -e "MINIO_CONFIG_ENV_FILE=/etc/config.env"    \
  --name "minio_local"                          \
  minio server --console-address ":9001"
4.验证容器状态
shell 复制代码
docker logs minio

该命令应返回类似以下的输出:

shell 复制代码
Status:         1 Online, 0 Offline.
API: http://10.0.2.100:9000  http://127.0.0.1:9000
RootUser: myminioadmin
RootPass: minio-secret-key-change-me
Console: http://10.0.2.100:9001 http://127.0.0.1:9001
RootUser: myminioadmin
RootPass: minio-secret-key-change-me

Command-line: https://minio.org.cn/docs/minio/linux/reference/minio-mc.html
   $ mc alias set myminio http://10.0.2.100:9000 myminioadmin minio-secret-key-change-me

Documentation: https://minio.org.cn/docs/minio/container/index.html
5.浏览器中输入http://localhost:9001 来访问MinIO Web控制台

Laravel框架使用minio

安装三方库以及配置

composer.json 添加

json 复制代码
{
    "require": {
      "tanghengzhi/aws-sdk-php-laravel": "^3.7"
    }
}
shell 复制代码
php composer.phar update
或者
composer update

配置config/app.php 和 AWS Facade

php 复制代码
'providers' => array(
        // ...
        Aws\Laravel\AwsServiceProvider::class,
    )
php 复制代码
'aliases' => array(
        // ...
        'AWS' => Aws\Laravel\AwsFacade::class,
    )

生成configuration文件

shell 复制代码
php artisan vendor:publish  --provider="Aws\Laravel\AwsServiceProvider"

config/aws.php的配置

php 复制代码
return [
    'version' =>'latest',
    'region'  => env('AWS_REGION', 'ap-south-1'),
    'endpoint' => env('AWS_ENDPOINT', 'http://127.0.0.1:9000'),
    'use_path_style_endpoint' =>true,
    'credentials' => [
        'key'    => env('AWS_KEY', 'key'),
        'secret' => env('AWS_SECRET', 'secret'),
    ],
    'Ses' => [
        'region' => env('AWS_SES_REGION', 'ap-south-1'),
    ],
    'Bucket' => env('AWS_SES_Bucket', 'Bucket'),
];
使用Laravel操作minio
php 复制代码
    //创建桶 $buket 桶名称
    public function createBucket($buket)
    {
        $s3 = AwsFacade::createClient('s3');
        $s3->createBucket(['Bucket' => $buket]); //创建桶
        return true;
    }
    
    //删除文件  url为创建接口返回的完整路径
    public function deleteFile($url)
    {
        if (empty($url)) return false;
        $s3 = AwsFacade::createClient('s3');
        $s3->deleteObject([
            'Bucket' => config('aws.Bucket'), //存储桶名称
            'Key' => strrchr($url, '/'), //文件名 去掉time-management
        ]);
        return true;
    }

    //复制文件  url为创建接口返回的完整路径
    public function copyFile($sourceUrl)
    {
        if (empty($url)) return false;
        $s3 = AwsFacade::createClient('s3');
        #文件扩展名
        $extend = strrchr($sourceUrl, '.');
        # 自定义文件名
        $fileName = date('Ymd') . '-' . uniqid() . $extend;
        $s3_return = $s3->copyObject([
            'Bucket' => config('aws.Bucket'), //存储桶名称
            'CopySource' => $sourceUrl,
            'Key' => $fileName,
        ]);
        if ($s3_return['@metadata']['statusCode'] == 200) {
            return $s3_return['@metadata']['effectiveUri'];
        } else {
            return false;
        }
    }
    
    //桶列表
    public function buketList($buket, $maxkey, $after, $prefix = '')
    {
        $s3 = AwsFacade::createClient('s3');
        $keys = $s3->listObjectsV2([
            'Bucket' => $buket,
            'Prefix' => $prefix,
            'MaxKeys' => $maxkey,
            'StartAfter' => $after
        ]);
        return $keys['Contents'];
    }
    
    //创建直传链接
    public function presignedRequest($name)
    {
        //从client中获得一个commad对象
        $s3Client = AwsFacade::createClient('s3');
        $command = $s3Client->getCommand('PutObject', [
            'Bucket' => config('aws.Bucket'),
            'Key' => $name
        ]);
        // 获得一个10分钟有效期的pre-signed URL
        $presignedRequest = $s3Client->createPresignedRequest($command, '+10 minutes');
        // 获得presigned-url
        $presignedUrl = (string)$presignedRequest->getUri();
        return $presignedUrl;
    }
Minio zip文件解压

官方没有提供解压的Api,所以自己用php写解压脚本,传入文件名称,解压返回目录

php 复制代码
<?php
$success = [
    'code' => 200,
    'data' => '',
];
$error = [
    'code' => 500,
    'data' => '',
];
if (empty($_POST['name'])) {
    $error['data'] = '系统错误';
    echo json_encode($error);
    exit();
}
//接受文件名称
$name = $_POST['name'];
//解析文件后缀和名称
$path_info = pathinfo($name);
$basename = $path_info['filename'];
//生成需要创建的文件夹名称
$mkdir_path = "/home/docker_data/minio/data/{bucket}/$basename";
$undir_path = "/home/docker_data/minio/data/{bucket}/$name";
//判断地址是否存在 拼装shell脚本
if (file_exists($mkdir_path)) {
    $shell = "export LANG=en_US.UTF-8;cd / && unzip -o -O GBK -d $mkdir_path $undir_path";
} else {
    $shell = "export LANG=en_US.UTF-8;cd / && mkdir $mkdir_path && unzip -o -O GBK -d $mkdir_path $undir_path";
}
//执行shell脚本
exec($shell, $result, $status);
if (empty($result)) {
    $error['data'] = '系统错误';
    echo json_encode($error);
    exit();
}
//去掉最外层文件夹名称
unset($result[0]);
if (empty($result)) {
    $error['data'] = '系统错误';
    echo json_encode($error);
    exit();
}
$folder = [];
//循环组装自己想要的目录
foreach ($result as $k => $v) {
    if (strpos($v, 'creating')) {
        continue;
    }
    $str = str_replace('inflating:', '', $v);
    $str = str_replace('creating:', '', $str);
    $str = str_replace('extracting:', '', $str);
    $str = str_replace('/home/docker_data/minio/data/{bucket}/'.$basename.'/', '', $str);
    $str = str_replace(' ', "", $str);
    $folder[] = $str;
}
$success['data'] = $folder;
echo json_encode($success);
exit();

总结

本文详细介绍了如何在Laravel框架中集成MinIO对象存储服务,并展示了如何执行基本的文件操作和ZIP文件解压。通过MinIO,开发者可以轻松地在Laravel应用中实现高性能的文件存储和管理功能。

相关推荐
两个人的幸福2 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo4 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack4 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982075 天前
PHP 扩展——从入门到理解
php
鹏仔先生5 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下6 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip6 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒6 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2506 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis6 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel