laravel视频对接aws

news2024/11/24 19:38:19

本次对接文件上传,目标是实现超级大文件的上传任务,可能就是4~5个g的视频文件,折腾了蛮久熟悉s3,因此记录一下。

大家要是对filesystem不清楚去看一下官方文档不然可能有点懵逼。

首先我先是对接了一个普通的s3存储文件的功能,但是这个不能存储太大的文件。

upload:

    private function uploadToS3()
    {
        try {
            $request  = request();
            $file =  $request->file('image_files');

            $name = md5(uniqid(md5(microtime(true)), true)) . '.' . $file->getClientOriginalExtension();

            $recPath = Storage::disk('s3')->put($name, file_get_contents($file));
            if ($recPath) {
                $recUrl = Storage::disk('s3')->url($name);
                return ['url'=>$recUrl,'name'=>$name,'$recPath'=>$recPath];
            }
        } catch (\Exception $e) {
            throw new CustomException($e->getMessage());
        }
    }
$recPath = Storage::disk('s3')->put($name, file_get_contents($file)); 中Storage::disk('s3')意思就是采用s3的存储引擎,然后直接put到s3的存储桶里面。因为laravel自带的filesystem提供了对s3的支持,因此可以便捷地使用s3。

当然就这个方法还不够,还需要我们配置好才可以。

我们需要进入到filesystems.php文件下面,进行配置

由于默认使用的本地驱动

因此我们要用s3就必须带上Storage::disk('s3')

env是全局变量,是.env文件里面配置好了地参数

其实laravel简单接入s3的存储很简单,只需要配置好,然后调用即可访问。当然,控制台那边的存储同需要可以被公共访问才可以,下面会讲到。

将上面的事情做完就可以实现上传文件并且访问。不过这种方法并不支持大文件,文件过大就会报错:

下面就是实现大文件上传的方法步骤。

一般来说,大文件上传大家会采取分片上传,续点上传的方式,不过我这次没有使用哪种方式。我使用的是aws 提供的一种由前端直接上传文件至S3的方式.

         此方法由AWS提供,它不仅能是上传速度更快,且同时支持上传大文件,AWS的JSSDK已经封装好了,我们只需要拿来用就行,架构如下:

  包含有对接实例的官方文档:Uploading to Amazon S3 directly from a web or mobile application | AWS Compute Blog

其实大概思路就是,后端先通过访问aws的接口获取到一个加权url并且返回给前端。使用预签名 URL 上传对象 - Amazon Simple Storage Service

有了加权的url前端就可以直接使用这个加权的url来进行文件的上传,并且我亲自测试,上传2,3个g的文件也不会出问题。然后我们直接把访问路径获取到返回给前端进行访问。这么一看是不是比分片上传还要方便?

中间的中间的web client,seq Auth,User service大家可以直接看作后端服务器。

首先先找到AWS SDK for PHP的操作文档,先按照文档的安装把包导进来以便可以使用aws官方的api。然后参照预签名示例来写代码。

使用 AWS SDK for PHP 版本 3 的 Amazon S3 预签名 URL - AWS SDK for PHP

    private function uploadToS3()
    {
        $fileName = request()->input('file_name');
        $bucket = 'xxxxxxxxxxxxx';
        $expiration = '+1 hour';

        $s3Client = new S3Client([
            'version' => 'latest',
            'region' => 'xxxxxxxxx',
            'credentials' => [
                'key' => 'xxxxxxxxx',
                'secret' => 'xxxxxxxxxxx',
            ],
        ]);
        $presignedUrl = $s3Client->getCommand('PutObject', [
            'Bucket' => $bucket,
            'Key' => $fileName,
            'Content-Type'=>'video/mp4'
        ]);
        $getObjectUrl = $s3Client->getObjectUrl($bucket, $fileName);

        $request = $s3Client->createPresignedRequest($presignedUrl, $expiration);
        $presignedUrl = (string)$request->getUri();
        return ['s3Url' => $presignedUrl, 'url' => $getObjectUrl];
    }

大家执行替换代码中的xxxx部分。

然后就是getCommand第一个参数其实就是选择api的作用,以下是可以选择的参数

其实挺明显的,选了PutObject,得到的s3Url就是用来上传的,GetObject则是获取的url(如果你的s3存储同是允许共有访问的,你就可以直接通过返回的url进行访问,否则只能通过s3Url进行访问)。

测试:

 

然后我直接拿着s3Url去发送Put请求

一定得是PUT请求,并且文件是binary而不是form-data,这个需要注意!!

然后我直接拿着开始upload给的url去访问

再次提醒,你得存储同权限需要是可共有访问得!!

策略这里添加

{
	"Version": "2012-10-17",
	"Id": "S3PolicyId1",
	"Statement": [
		{
			"Sid": "Statement1",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::bucketName/*"
		}
	]
}

跨域这里添加

[
    {
        "AllowedHeaders": [],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

全部弄好之后基本上可以上传成功并且访问。

当然还有种情况就是,视频成功上传,也可以访问,但是它是直接下载而不是可以直接观看,这里可以借鉴这个文章

Solved: Video On Amazon S3 Downloading Instead of Playing – TechBasedMarketing

就是桶里面对象得元数据,需要是这个格式才行,不然访问url,视频就是下载而不是播放了。

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

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

相关文章

[解决] 为什么 App Inventor 扩展导入了,但是没啥反应?

大概率是导入拓展后,没有拖动拓展到界面上! 导入拓展后,别忘了拖动拓展到主界面上,这样才算真正创建了拓展对象,这时才能使用拓展的方法。 原文:为什么 App Inventor 扩展导入了,但是没啥反应&…

了解Cookie登录:原理、实践与安全指南

什么是Cookie登录? Cookie是什么 当你首次登录网站时,你会输入用户名和密码。在后台,网站的服务器验证这些凭据是否正确。一旦确认你的身份无误,服务器就会创建一个Cookie,并将其发送到你的浏览器。这了解Cookie登录…

量子+AI,实用还需多久?

生成式人工智能正在席卷全球。OpenAI的GPT-4能够通过律师资格考试,Midjourney的图像作品能够赢得艺术大奖,而Sora则能够根据文本创造出令人难以置信的逼真视频。 这些AI模型的成就预示着通用人工智能的曙光——一个曾经只存在于科幻小说中的概念。然而&a…

快速了解网站访问为什么提示存在安全隐患,该怎么解决

这通常是由于网站使用了不安全的HTTP协议进行通信,或者网站的SSL证书存在问题,或者网站被标记为危险,或者网页中混杂了非HTTPS的内容。 网站访问提示不安全通常是由于以下原因之一引起的,可以按照相应的解决方案进行排查和解决&…

Java集合相关的List、Set、Map基础知识

目录 一、集合介绍 二、List 三、Map HashMap的数据结构 如何理解红黑树 四、set 一、集合介绍 在Java中,集合是一种用于存储对象的数据结构,它提供了一种更加灵活和强大的方式来处理和操作数据。Java集合框架提供了一系列接口和类,用…

CyberData统一元数据服务

CyberData统一元数据服务功能完善,实现了湖仓平台元数据在整个平台的统一管理以及外部数据源元数据的主动发现和多计算引擎间元数据的互通互联。 同时,我们支持跨多元计算场景,以及在元数据基础上的统一数据权限管理和数据湖的自动化优化加速…

2024年好用又便宜的云手机!哪款性价比高?

随着科技的飞速发展,云计算技术也在不断演进,而云手机作为其创新之一,已经开始在我们的生活中崭露头角。它通过将手机的硬件和软件功能移到云端,让用户能够借助强大的云计算资源完成各种任务。2024年,哪款云手机性价比…

springboot整合rabbitMQ系列10 利用插件实现延时消息

插件的安装,本文就不做描述了,插件安装后如下,就说明安装成功了1 添加pom依赖,yml配置就不讲了2 核心类,定义交换机的代码改成如下,其它的定义队列,设置绑定关系,设置死信等&#xf…

WebStorm 2024 for Mac:前端开发的强大助手

WebStorm 2024 for Mac是一款专为前端开发者设计的集成开发环境(IDE),以其强大的功能和出色的性能,为Mac平台上的开发者提供了高效、便捷的Web开发体验。 WebStorm 2024 for Mac v2024.1.1中文激活版下载 这款IDE支持多种编程语言…

深入理解GTK、Qt、AWTK:跨平台GUI框架对比

目录标题 GTK特性:优点:缺点: Qt特性:优点:缺点: AWTK特性:优点:缺点: 适用场景 在当今的软件开发领域,图形用户界面(GUI)的开发是不可…

鸿蒙APP开发页面组件之间的属性关系

我们将对于多页面以及更多有趣的功能展开叙述,这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式(UiAbility),样式的书写、状态管理以及动画等方面进行探讨 页面之间…

文件权限管理

文件权限管理 1. 权限对象 权限对象含义u属主,所有者g属组o其他人 2. 权限类型 权限类型含义值r读权限4w写权限2x执行权限1 3. 修改文件属主及属组 命令:chown(change own)更改文件或目录属主与属组名 3.1 修改文件属主与属组 只修改属主:chown $…

交互式探索微生物群落与生态功能的关系

微生物群落在生态系统中发挥则重要功能,我们在对微生物群落进行分析时,会将不同分类水平(从门到属)的微生物类群的相对丰度与测定的某一生态功能进行相关性分析。但由于微生物类群数较多,又有不同的分类水平&#xff0…

python利用tg机器人推送发消息从安装到使用(二)

上一篇请参考: python利用tg机器人推送发消息从安装到使用-CSDN博客 本篇主要针对第二种方式推送tg消息,也就是使用telegram库的Bot发送消息,不仅可以发送文本,还可以方便的发送超链接内容和图片。 不过,随着telegram库的升级等各种原因,目前网上很多代码都不能直接使…

汽车组装3D电子说明书更通俗易懂

激光打印机由于造价高、技术更先进,因此在使用和维护上需要更专业的手法,而对于普通客户来说并不具备专业操作激光打印机的技能,为了通俗易懂地让客户理解激光打印机,我们为企业定制了激光打印机3D产品说明书,将为您带…

【如此简单!数据库入门系列】之ER模型快速入门

文章目录 模式设计基本概念实体(Entity)属性(Attributes)实体集和键(key)关系(Relationship) ER图实体和属性关系 泛化与特化总结更多例子 模式设计 大家还记得什么是物理模式、概念…

竞赛课第九周(埃式筛法,矩阵乘法)

1.埃式筛法:求区间[2, n]内所有的素数对 【参考代码】 #include <bits/stdc.h> using namespace std;const int N 1e5; vector<int> prime; bool visit[N];int main() {int n;cin>>n;memset(visit, false, sizeof(visit));for(int i2; i<sqrt(n); i){i…

备考数通HCIE证书4点经验分享!

大家好&#xff0c;我是来自安阳工学院20级网络工程的刁同学&#xff0c;在2023年12月20日成功通过了华为Datacom HCIE认证&#xff0c;并且取得了笔试900多分&#xff0c;实验B的成绩。在此&#xff0c;我想把我的一些考证心得分享给正在备考的小伙伴们。 关于为什么考证 我…

滚珠丝杆有哪些应用场景?

在传动领域中滚珠丝杆是自动化设备和智能制造设备相结合的关键装置&#xff0c;在精密制造工艺、精密装配作业及现代物流系统等多元领域中&#xff0c;发挥着不可或缺的核心作用。其优点在于快速、高效、准确可靠和稳定。它能够在较小的转矩下产生很大的推力&#xff0c;所以被…

VOS3000加装登陆服务器安全防护系统有用吗

VOS3000是一款专业的软交换系统&#xff0c;它主要用于中小规模的VoIP运营业务&#xff0c;包括运营费率设定、套餐管理&#xff0c;账户管理、业终端管理、网关管理、数据查询、卡类管理、号码管理、系统管理等功能1。而关于加装登陆服务器安全防护系统是否有用&#xff0c;这…