PHP aws-sdk-php文件存储的实现与应用

news2025/1/12 1:47:05

前言

最近项目需要用到对象存储,将所有上传文件,存储到BOS云存储上。在开发过程中,遇到一些小小的问题,做个简单记录。

功能实现

1 下载sdk(以下两种方式,任选其一即可)

(1)使用composer 安装

composer require aws/aws-sdk-php

(2) 下载aws.phar

2 项目中使用,代码实现。

<?php
    // sdk
    $bucket = 'upload'; // 容器名称[调整填写自己的容器名称]
    $key = 'index.html'; // 要上传的文件
    $region = 'us-east-1';//地区
    $endpoint = 'https://obs-hazz.cucloud.cn';//
    $ak = 'XXXXXXXXXXXXXXXXXXXXXXXXXX';// ak
    $sk = 'XXXXXXXXXXXXXXXXXXXXXXXXXX';// sk

    // https://github.com/aws/aws-sdk-php
    include 'aws.phar';

    // Register S3 Client
    $s3 = new Aws\S3\S3Client([
        'version' => 'latest',
        's3ForcePathStyle' => true,
        'region' => $region,
        'endpoint' => $endpoint,
        'credentials' => [
            'key' => $ak,
            'secret' => $sk,
        ],
        // 'scheme' => 'http',
        // 'debug' => true,
    ]);


    // Put data to S3 bucket
    try
    {
        $key = '5.jpg';
        $s3->putObject([
            'Bucket' => $bucket,
            'Key'    => $key,
            'Body'   => fopen($key,"r"),
        ]);
    }
    catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }


    // GET Object
    try
    {
        $result = $s3->getObject([
            'Bucket' => $bucket,
            'Key'    => $key
        ]);
        echo "\n---BEGIN---\n";
        echo $result['Body'];
        echo "\n----END----\n\n";
    }
    catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }


    // GET Object head
    try
    {
        $result = $s3->headObject([
            'Bucket' => $bucket,
            'Key'    => $key,
        ]);
        echo "\n---BEGIN---\n";
        echo $result->get("LastModified");
        echo $result->get("ContentLength");
        echo $result->get("AcceptRanges");
        echo "\n----END----\n\n";
    }
    catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }


    // Delete object
    try
    {
        echo 'Attempting to delete ' . $key . '...' . PHP_EOL;

        $result = $s3->deleteObject([
            'Bucket' => $bucket,
            'Key'    => $key
        ]);
    }
    catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }

注意:

(1)以下是我程序中功能实现部分,项目中我只用到了文件上传与文件删除,各位工友使用的话要调整自己的配置哟~

(2)本地图片上传与抓取远程图片上传是不一样的哟~

(3)上传文件时要注意设置'ACL' => 'public-read';

<?php
// +----------------------------------------------------------------------
// | Author: xiaozhezhe
// +----------------------------------------------------------------------
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
use GuzzleHttp\Client;

$bosConfig = config('basic.BOS_SET');
$s3 = new S3Client([
    'version' => 'latest',
    's3ForcePathStyle' => true,
    'region' => $bosConfig['region'],
    'endpoint' => $bosConfig['endpoint'],
    'credentials' => [
        'key' => $bosConfig['ak'],
        'secret' => $bosConfig['sk'],
    ],
]);

// 本地上传图片到bos
function uploadToBos($filename,$filepath)
{
    try
    {
        $s3result = $s3->putObject([
            'Bucket' => $bosConfig['bucket'],
            'Key'    => $filename,
            'Body'   => fopen($filepath,"r"),
            'ACL'    => 'public-read'
        ]);
    } catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }
    $filePath = $s3result['ObjectURL'] ?? "";
    return $filePath;
}

// 远程抓取图片上传bos
function uploadOtherToBos($filename,$filepath)
{
    $http = new Client();
    $res = $http->request('GET',$filepath);
    try
    {
        $s3result = $s3->putObject([
            'Bucket' => $bosConfig['bucket'],
            'Key'    => $filename,
            'Body'   => $res->getBody(),
            'ContentLength' => $res->getHeader('content-length')[0],
            'ACL'    => 'public-read'
        ]);
    }  catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }
    $filePath = $s3result['ObjectURL'] ?? "";
    return $filePath;
}

// 删除远程bos图片
function deleteBosFile($filename) 
{
    try
    {
        $result = $s3->deleteObject([
            'Bucket' => $bosConfig['bucket'],
            'Key'    => $filename
        ]);
        return true;
    }
    catch (Aws\S3\Exception\S3Exception $e) {
        exit('Error: ' . $e->getAwsErrorMessage() . PHP_EOL);
    }
}

常见问题

(1)上传不成功,一直转圈。

对接过程中,发现上传没什么反应,一直转圈圈,这个问题我查了很多文档,一直找不到原因,困扰了我一天,百思不得其解。

原因 :

       endpoint 地址配置问题;

解决方案:
          查看 endpoint 地址是否配置正确;切记切记,要检查所有的配置,保证配置正确!!!

(2)Curl 77/60 等问题

原因:

        证书问题

解决方案:

        (1)安装相关证书;

        (2) 我这边证书搞定之后还是crl问题,于是把 endpoint 地址从"https"更改为"http"就可以正常上传了;

(3)错误提示:payload content length is required and can not be calculated

原因:

        上传图片为链接,非本地图片

解决方案:

        (1)php 安装 guzzlehttp;
        (2)参考上述代码实现中的远程图片上传;

总结:

工作累了,要适当划水~~~

划水同时,要多喝热水~~~

要运动保持好身体~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118137.html

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

相关文章

手绘图说电子元器件-电阻,电容,电感

电阻器与电位器 电阻器是最基本的电子元件,电位器是最基本的可调电子元件,它们广泛应用在各种电子电路中。 电阻器 电阻器是限制电流的元件,通常简称为电阻,是一种最基本、最常用的电子元件,包括固定电阻器、可变电阻器、敏感电阻器等。 电阻器的主要参数有电阻值和额…

FFT(2)

DFT到FFT 这是DFT公式 对DFT代数变换 将DFT的计算&#xff0c;分为计数组和偶数组。 惊奇的发现&#xff1a;只需要改变WkNW_k^NWkN​的符号即可得到X&#xff08;k&#xff09;的另一半项数的结果。 得到FFT算法&#xff08;蝶形运算&#xff09; 惊奇的发现&#xff1…

docker安装教程,即学即会

docker教程&#xff1a; https://www.runoob.com/docker/docker-tutorial.html卸载docker 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序&#xff0c;请卸载它们以及相关的依赖项。 yum remove docker docker-client docker-client-latest docker-co…

maven打包缺少依赖异常eu.neilalexander:jnacl:jar:1.0.0 was not found in...解决

在Linux系统的服务器上使用脚本部署项目&#xff0c;脚本的逻辑是&#xff1a; 进入到工作空间的项目文件夹从SVN拉取最新代码命令svn up执行mvn clean执行mvn package进入jar包生成的target文件夹nohub java -jar xxxxx.jar >/dev/null 2>&1 & 在项目打包过程…

C++迭代器详解

思考一个问题&#xff1a;我们该如何遍历一个字符串呢&#xff1f; 方法一&#xff1a;正常遍历 string s1("hello"); for(size_t i 0;i<s1.size();i) {cout<<s1[i]<<" ";//[]是一个重载运算符&#xff0c;实际上调用了s1.operator[](i)…

【爬虫+数据清洗+可视化分析】用Python分析哔哩哔哩“阳了“的评论数据

目录 一、背景介绍 二、爬虫代码 爬虫部分不作讲解。 三、可视化代码 3.1 读取数据 3.2 数据清洗 3.3 可视化 3.3.1 IP属地分析-柱形图 3.3.2 评论时间分析-折线图 3.3.3 点赞数分布-直方图 3.3.4 评论内容-情感分布饼图 3.3.5 评论内容-词云图 三、演示视频 一、…

Ansible常用模块

ping模块 验证主机的连通性 [rootmonster1 ~]# ansible all -m ping 192.168.71.131 | SUCCESS > {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong&q…

Java中mongodb指定DB通过aggregate聚合查询操作示例

目录 前言&#xff1a; 应用场景&#xff1a; 命令描述&#xff1a;​ 代码示例&#xff1a; 聚会查询&#xff1a; 数量查询&#xff1a; 前言&#xff1a; 大家都知道&#xff0c;mongodb是一个非关系型数据库&#xff0c;也就是说&#xff0c;mongodb数据库中的每张表…

node-express学习总结

项目搭建 1. 使用express提供的框架构建&#xff08;不需要&#xff09; 2. 从零开始&#xff08;推荐&#xff09;安装 初始化项目 npm init -y安装express npm install express1.express的基本使用 创建js文件 const express require(express) // 1&#xff0c;创建服…

SSL/TLS类安全漏洞及SLB安全漏洞问题

SSL/TLS类安全漏洞及SLB安全漏洞问题1 : 问题背景1.1、SSL/TLS类漏洞-Sweet32 攻击1.2、SSL/TLS类漏洞-弱密码套件2 : 解决思路2.1、学习SSL/TLS是什么2.2、安装检测工具2.3、升级OpenSSL2.4、调整加密算法3 : 总结3.1、比较环境的不同3.2、解决该问题3.3、相关资源1 : 问题背景…

创建进程与进程地址空间

目录 创建进程 进程地址空间 为什么要用虚拟地址呢&#xff1f; 什么是进程地址空间&#xff1f; 为什么要写时拷贝呢&#xff1f; 创建进程 前面提到使用fork可以创建子进程&#xff0c;现在介绍fork创建子进程的细节。 fork创建子进程的时候&#xff0c;子进程的内核数…

如何给公司内网搭建一个专用的DNS服务器?

如何给公司内网搭建一个专用的DNS服务器&#xff1f; 引言 平时做域名解析&#xff0c;一般直接修改的/etc/hosts文件。对于服务器数量小的情况完全可以&#xff0c;但是如果服务器数量较多&#xff0c;每个都修改比较麻烦。 DNS是作为域名解析。在实际的生产过程中&#xff…

基于ASP.NET C#的服装商城管理系统

摘 要 本毕业设计的内容是设计并且实现一个基于net语言的服装商城管理系统。它是在Windows下&#xff0c;以SQL Server为数据库开发平台&#xff0c;服装商城管理系统的功能已基本实现&#xff0c;主要包括用户、服装信息、通知公告、留言板、订单信息等。 论文主要从系统的分…

飞腾FT-2000/4处理器+复旦微FPGA+国产操作系统解决方案(2)

XM-1104飞腾核心处理主板 ▶体积小、功耗低、高性能。 ▶功能接口多样化&#xff0c;采用高密度连接器&#xff0c;抗震效果好。 ▶成本低&#xff0c;扩展性强&#xff0c;根据用户的需求定制各种底板。 ▶产品灵活&#xff0c;便于维护&#xff0c;生命周期长。 指标 参数 …

SuperMap GIS地质体数据处理QA

作者:hyy 一、地质体数据简介 什么是三维地质建模&#xff1f;百度上给出的解析是&#xff1a;将地质、测井、地球物理资料和各种解释结果或者概念模型综合在一起生成的三维定量随机模型。 已建成的地质模型可以为我们提供很多信息。首先是地质的三维可视化。通过三维可视化&…

量子计算机:一场改变世界的开发竞赛

这样的设备可能会帮助解决气候变化和粮食短缺问题&#xff0c;也可能破坏互联网。在这场竞赛中&#xff0c;美国和中国谁会先到达目标&#xff1f; 神秘的机器 在加利福尼亚州圣巴巴拉的郊区&#xff0c;在果园和大海之间&#xff0c;坐落着一个不起眼的仓库&#xff0c;它的窗…

【区块链 | EVM】深入理解学习EVM - 深入Solidity数据存储位置

目录 目录 简介 EVM是一个工业工厂 为什么要在 Solidity 中理解 Evm 数据位置&#xff1f; 数据位置 → 概述 存储 内存 Calldata 堆栈&#xff08;Stack&#xff09; 代码 数据位置 - 规则 变量的默认位置 参考类型 在函数参数上的规则 在函数体内的规则 内存…

使用 QuTrunk+Amazon ParallelCluster3 进行并行计算

1.丘秉宜&#xff1b;2.邵伟&#xff1b;3.黄文&#xff1b;4.郭梦杰&#xff1b;5.刘利&#xff1b;6.刘波 1.亚马逊云科技 Hero&#xff1b;2.启科开发者生态负责人&#xff1b;3.启科 DEVOPS 工程师&#xff1b;4.启科量子资深研发工程师&#xff1b;5和&#xff1b;6.C高级…

Linux运维之knockd部署

如果你有一台公众可访问的服务器&#xff0c;黑客可以轻松扫描其IP地址&#xff0c;查找服务器上的开放端口(尤其是用于SSH的端口22)。将服务器隐藏起来、不让黑客看见的一种方法是使用knockd。knockd是一种端口试探服务器工具。它侦听以太网或其他可用接口上的所有流量&#x…

以代码绘制圣诞,过快乐圣诞节!

2022年圣诞节 12月25日 星期日 圣诞节的由来 基督教纪念耶稣诞生的重要节日。亦称耶稣圣诞节、主降生节&#xff0c;天主教亦称耶稣圣诞瞻礼。耶稣诞生的日期&#xff0c;《圣经》并无记载。公元336年罗马教会开始在12月25日过此节。12月25日原是罗马帝国规定的太阳神诞辰。有人…