laravel视频对接aws

news/2024/10/20 5:24:26/

本次对接文件上传,目标是实现超级大文件的上传任务,可能就是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.ppmy.cn/news/1439161.html

相关文章

【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡),简单绘图工具制作

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

vue与Spring boot数据交互例子【简单版】

文章目录 什么是Vue?快速体验Vueaxios是什么?向Springboot后端发送数据接收Springboot后端数据小结 什么是Vue? 官网解释:Vue 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上…

Oracle中取出clob类型

1、Mybatis返回值用map接受,对应的value类型就是个clob类型,可以确保不会丢失长度,自带的sql执行器转varchar2的话可能会长度丢失。 2、将map放入工具类(clob类型转String) package com.ly.cloud.common.utils;import java.sql.Clob; impor…

electron 中统一管理全局常量

在 Electron 应用中统一管理全局常量是一个好的实践,可以帮助你维护清晰的代码结构,并使得常量在整个主进程和渲染进程之间轻松共享。以下是几种在 Electron 中管理全局常量的方法: 1. 使用 JavaScript 模块 创建一个常量模块 你可以创建一…

Linux已安装virtualenv 但还是报 bash: virtualenv: command not found 错误原因及解决

场景 在 linux 上已经安装了python和 virtualenv ,但是直接执行 virtualenv 相关的指令创建虚拟环境还是失败并且报错 bash: virtualenv: command not found 原因 虽然手动安装了virtualenv 没有自动配置 virtualenv 的软连接 解决方式 手动在安装目录下去执行…

面试的时间地点(南京坦道)工程化问题比较少,通用性问题表较多

1.前端的选型 2.前端的$nicktick() 3.前端的媒体查询 4.前端的 VUE 高级用法 我的回答{ web端视图层的渲染原理 } 5.前端的数组,异步处理 我的回答{ 回了,最笨的方法。 es6的set(); 参数是&…

Django 学习 笔记

Django 一、模型models 继承django.db.models.Model 1.模型字段 / 模型字段选项参考: 官网:https://docs.djangoproject.com/zh-hans/3.2/ref/models/fields/#common-model-field-options 2.模型Meta选项(定义模型类的属性): csdn: https:/…

springcloud按版本发布微服务达到不停机更新的效果

本文基于以下环境完成 spring-boot 2.3.2.RELEASEspring-cloud Hoxton.SR9spring-cloud-alibaba 2.2.6.RELEASEspring-cloud-starter-gateway 2.2.6.RELEASEspring-cloud-starter-loadbalancer 2.2.6.RELEASEnacos 2.0.3 一、思路 实现思路: 前端项目在请求后端接…