mreduar/s3m
Composer 安装命令:
composer require mreduar/s3m
包简介
Multipart Uploads using Laravel and AWS S3
关键字:
README 文档
README
S3M - Multipart Uploads using Laravel and AWS S3
Sometimes when running an application in a serverless environment, you may not store files permanently on the local filesystem, since you can never be sure that the same serverless "container" will be used on a subsequent request. All files should be stored in a cloud storage system, such as AWS S3, or in a shared file system through AWS EFS. Or, you may want to send a file directly to Amazon S3 simply because you don't want the server to receive files directly.
When uploading large files to S3, you may run into the 5GB limit for a single PUT request. This package allows you to upload large files to S3 by splitting the file into smaller parts and uploading them in parallel.
- Features
- Architecture
- Installation
- Usage
- Changelog
- Contributing
- Security Vulnerabilities
- Credits
- License
Features
- Upload large files that exceed the 5GB limit
- Upload files in parallel
- Retry failed uploads automatically
- Configurable Chunked uploads
- Configurable number of parallel uploads
- Authorization checks before uploading files
- Configurable retry attempts
Architecture
sequenceDiagram
autonumber
participant User
participant Browser (SPA)
participant Server
participant API Gateway/Lambda
participant S3
User-->>Browser (SPA):Open Web App
Browser (SPA)-->>Server:Get App
User-->>Browser (SPA):Upload File
Browser (SPA)-->>API Gateway/Lambda:Initialize Multipart Upload
API Gateway/Lambda-->>S3:Get Upload ID
Browser (SPA)-->>API Gateway/Lambda:Get Multipart PreSigned URLs
API Gateway/Lambda-->>S3:Get Presigned URLs
par Parallel Upload
Browser (SPA)-->>Browser (SPA):Make part 1
Browser (SPA)-->>S3:Upload Part 1
end
Browser (SPA)-->>API Gateway/Lambda:Finalize Multipart Upload
API Gateway/Lambda-->>S3:Mark upload complete
Loading
Installation
You can install the package via composer:
composer require mreduar/s3m
Add the @s3m Blade directive to your main layout (before your application's JavaScript), and the s3m() helper function will be available globally!
Configuration
S3M's default configuration settings can be customized. First, publish the configuration file:
php artisan vendor:publish --provider="MrEduar\S3M\S3MServiceProvider"
This will create config/s3m.php in your project. There, you can customize S3M's configuration, including the AWS environment settings.
Usage
Authorization
Before initiating an upload directly to S3, S3M's internal signed storage URL generator will perform an authorization check against the currently authenticated user. If you do not already have one, you should create a UserPolicy for your application using the following command:
php artisan make:policy UserPolicy --model=User
Next, you should add an uploadFiles method to this policy. This method should return true if the given authenticated user is allowed to upload files. Otherwise, you should return false:
/** * Determine whether the user can upload files. * * @param \App\User $user * @return mixed */ public function uploadFiles(User $user) { return true; }
Streaming Files To S3
You may use the s3m() method within your frontend code to upload a file directly to the S3 bucket attached to your environment. The following example demonstrates this functionality using Vue:
<input type="file" id="file" ref="file" @change="uploadFile"> const uploadFile = (e) => { const file = e.target.files[0]; s3m(file, { progress: progress => { uploadProgress.value = progress; } }).then((response) => { axios.post('/api/profile-photo', { uuid: response.uuid, key: response.key, bucket: response.bucket, name: file.value.name, content_type: file.value.type, }) }); };
All uploaded files will be placed in a tmp directory within the bucket. This directory should be configured to automatically purge any files older than 24 hours. This feature serves to conveniently clean up file uploads that are initiated but not completed, such as a user that begins updating their profile photo but does not save the change.
The tmp directory is private by default. To override this for a given file you may add a visibility property to the options provided to the s3m() method. The visibility property should be assigned one of S3's predefined permission grants:
s3m(file, { visibility: 'public-read', }).then((response) => { // ... });
Acknowledge File Uploads & Permanent Storage
All uploaded files will be stored using a UUID as their filename. The response provided to the s3m method's then callback will contain the UUID of the file, the file's full S3 key, and the file's bucket. You may then POST this information to your application's backend to permanently store the file by moving it out of the bucket's tmp directory. In addition, you may wish to store additional information about the file, such as its original name and content type, in your application's database:
use Illuminate\Support\Facades\Storage; Storage::copy( $request->input('key'), str_replace('tmp/', '', $request->input('key')) );
Changelog
Please see CHANGELOG for more information on what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Credits
This project is inspired by Laravel Vapor. The architecture and design of this package is influenced by the work of the Laravel team and other resources.
License
The MIT License (MIT). Please see License File for more information.
mreduar/s3m 适用场景与选型建议
mreduar/s3m 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 4.27k 次下载、GitHub Stars 达 17, 最近一次更新时间为 2024 年 07 月 22 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「laravel」 「Eduar Bastidas」 「s3m」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 mreduar/s3m 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 mreduar/s3m 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 mreduar/s3m 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Alfabank REST API integration
Laravel package for Accurate Online API integration.
Shared RCX Laravel DataTables UI and configuration helpers.
Boot a Laravel project on any machine with one command: app:serve installs missing tools (PHP, Node, Composer, Herd, Docker), creates .env, sets up the database, runs migrations, builds assets, starts a queue worker and serves via Herd, Sail or artisan serve; app:down cleanly stops everything it sta
Branded, diagnostic error pages (500, 403, 404, 419, 503) for Filament — native Filament UI, dark mode and translations out of the box.
Turn any PDF into a Pingen-ready A4 letter (generated address cover page + A4 normalisation + safe margins) and send it through the Pingen print & mail API. Laravel-first.
统计信息
- 总下载量: 4.27k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 17
- 点击次数: 10
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2024-07-22
