tapp / blade-uppy
Laravel 的 Uppy Blade 组件
Requires
- php: ^7.4|^8.0
- illuminate/contracts: ^8.0|^9.0|^10.0
Requires (Dev)
- orchestra/testbench: ^6.0|^7.0|^8.0
- pestphp/pest: ^1.23
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.3
- spatie/laravel-ray: ^1.9
- vimeo/psalm: ^4.4
README
此包为 Laravel Blade 视图添加了 Uppy 的 Blade 组件。
安装
通过 Composer 安装包
composer require tapp/blade-uppy
添加所需的 JS 库
在您的 package.json 文件中添加 AlpineJS 库和所有您需要的 Uppy 库(或根据 Uppy 网站文档直接安装它们)
...
"devDependencies": {
"alpinejs": "^3.11.1",
...
},
"dependencies": {
"@uppy/aws-s3-multipart": "^3.1.2",
"@uppy/core": "^3.0.5",
"@uppy/drag-drop": "^3.0.1",
"@uppy/status-bar": "^3.0.1"
...
}
...
在您的 resources/js/bootstrap.js 文件中添加 Uppy 库
... require('@uppy/core/dist/style.min.css') require('@uppy/drag-drop/dist/style.min.css') require('@uppy/status-bar/dist/style.min.css') import Uppy from '@uppy/core' import DragDrop from '@uppy/drag-drop' import StatusBar from '@uppy/status-bar' import AwsS3Multipart from '@uppy/aws-s3-multipart' window.Uppy = Uppy window.DragDrop = DragDrop window.StatusBar = StatusBar window.AwsS3Multipart = AwsS3Multipart
在您的 resources/js/app.js 中添加
... import Alpine from 'alpinejs'; window.Alpine = Alpine; Alpine.start();
安装 JS 库
使用 Mix
npm install
npm run dev
使用 Vite
npm install
npm run build
发布配置文件(可选)
使用以下方式发布配置文件
php artisan vendor:publish --tag=blade-uppy-config
已发布的配置文件包含加载为组件的 Uppy 事件
return [ 'events' => [ 'cancel-all', 'complete', 'dashboard-file-edit-complete', 'dashboard-file-edit-start', 'dashboard-modal-closed', 'dashboard-modal-open', 'error', 'file-added', 'file-editor-cancel', 'file-editor-complete', 'file-editor-start', 'file-removed', 'files-added', 'info-hidden', 'info-visible', 'postprocess-progress', 'preprocces-progress', 'progress', 'reset-progress', 'restriction-failed', 'retry-all', 'thumbnail-generated', 'upload-error', 'upload-progress', 'upload-retry', 'upload-stalled', 'upload-success', 'upload', ], ];
发布视图文件(可选)
php artisan vendor:publish --tag=blade-uppy-views
用法
Uppy 上传器作为 Blade 组件可用
- AWS S3
<x-input.uppy.s3> - AWS S3 分片
<x-input.uppy.s3-multipart> - XHR
<x-input.uppy.xhr> - Tus
<x-input.uppy.tus> - Transloadit
<x-input.uppy.transloadit>
这是组件结构(以 s3 Blade 组件为例,但 s3-multipart、xhr、tus 和 transloadit 也是如此)
<x-input.uppy.s3 attribute="attribute value" ... > <!-- here in the component body, you can define the HTML to be used --> </x-input.uppy.s3>
应使用的 UI(dashboard 或 drag-drop)可以用 ui 属性定义,UI 选项可以用 uiOptions 属性定义
<x-input.uppy.s3 ui="drag-drop" uiOptions="{ target: '.upload' }" ... >
可以使用 plugins 数组属性添加任何插件,其中键是插件名称,值是插件选项
@php
$plugins = [
'StatusBar' => "{ target: '.upload', hideAfterFinish: false }",
];
@endphp
<x-input.uppy.s3
:plugins="$plugins"
...
>
可以使用 events 数组属性添加任何事件,其中键是事件名称,值是事件代码
@php
$plugins = [
'StatusBar' => "{ target: '.upload', hideAfterFinish: false }",
];
@endphp
<x-input.uppy.s3
:events="$events"
...
>
如果您需要添加额外的 JS 代码,请使用 extraJs 属性
<x-input.uppy.s3 extraJs="your JS code here" ... >
上传器
S3
将 input.uppy.s3 Blade 组件添加到您的 Blade 视图中
<x-input.uppy.s3 ui="dashboard" uiOptions="{ inline: true, target: '#uppy-dashboard'}" > <div id="uppy-dashboard"> </div> </x-input.uppy.s3>
S3 分片
将 input.uppy.s3-multipart Blade 组件添加到您的 Blade 视图中。例如,使用仪表板 UI
<x-input.uppy.s3-multipart uiOptions="{ inline: true, target: '#uppy-dashboard'}" audio="{ target: Dashboard }" instanceName="file" > <div id="uppy-dashboard"> </div> </x-input.uppy.s3-multipart>
XHR
将 input.uppy.xhr Blade 组件添加到您的 Blade 视图中。例如,使用拖放 UI
@php
$events = [
'upload-success' => "
const url = response.uploadURL;
const fileName = file.name;
const aleatorio = 1;
const uploadedFileData = JSON.stringify(response.body);
const li = document.createElement('li');
const a = document.createElement('a');
a.href = url;
a.target = '_blank';
a.appendChild(document.createTextNode(fileName));
li.appendChild(a);
document.querySelector('.upload .uploaded-files ol').appendChild(li);
var inputElementUrlUploadFile = document.getElementById('file2');
inputElementUrlUploadFile.value = url;
inputElementUrlUploadFile.dispatchEvent(new Event('input'));
",
];
$plugins = [
'StatusBar' => "{ target: '.upload .for-ProgressBar', hideAfterFinish: false }",
];
@endphp
<div class="flex items-center">
<input type="hidden" name="file" id="file" />
<x-input.uppy.xhr
ui="drag-drop"
uiOptions="{ target: '.upload .for-ProgressBar' }"
:events="$events"
:plugins="$plugins"
>
<section class="upload">
<div class="for-DragDrop" x-ref="input"></div>
<div class="for-ProgressBar"></div>
<div id="progress-bar"></div>
<div class="uploaded-files">
<h5>{{ __('Uploaded file:') }}</h5>
<ol></ol>
</div>
</section>
</x-input.uppy.xhr>
</div>
Tus
将 input.uppy.tus Blade 组件添加到您的 Blade 视图中
<x-input.uppy.tus uiOptions="{ inline: true, target: '#uppy-dashboard'}" > <div id="uppy-dashboard"> </div> </x-input.uppy.tus>
Transloadit
将 input.uppy.transloadit Blade 组件添加到您的 Blade 视图中
<x-input.uppy.transloadit uiOptions="{ inline: true, target: '#uppy-dashboard'}" > <div id="uppy-dashboard"> </div> </x-input.uppy.transloadit>
每个组件的可用属性
Uppy 实例名称
使用 instanceName 属性定义 Uppy 实例名称。
默认值:uppyUpload
核心选项
核心 Uppy 选项使用 coreOptions 属性定义。
默认值
{ debug: true, autoProceed: true, allowMultipleUploads: false, }
上传器选项
可以使用 uploaderOptions 属性定义。
默认值
{ companionUrl: '/', companionHeaders: { 'X-CSRF-TOKEN': window.csrfToken, }, }
用户界面
ui 属性
定义应使用的用户界面(UI)(仪表板或拖放)。可能的值
- dashboard
- drag-drop
例如:
ui="dashboard"
默认值:dashboard
uiOptions 属性
您可以通过 uiOptions 属性传递 Uppy UI JS 选项。
例如:
uiOptions="{ target: '.upload .for-ProgressBar' }"
默认值:{}
文档
仪表板示例
@php
$plugins = [
'Audio' => "{ target: Dashboard }",
];
@endphp
<x-input.uppy.s3-multipart
ui="dashboard"
uiOptions="{ inline: true, target: '#uppy-dashboard'}"
instanceName="file"
:plugins="$plugins"
>
<div id="uppy-dashboard">
</div>
</x-input.uppy.s3-multipart>
拖放示例
@php
$plugins = [
'StatusBar' => "{ target: '.upload .for-ProgressBar', hideAfterFinish: false }",
];
@endphp
<x-input.uppy.s3
ui="drag-drop"
coreOptions="{
debug: true,
autoProceed: true,
allowMultipleUploads: false,
}"
uiOptions="{ target: '.upload .for-ProgressBar' }"
:plugins="$plugins"
>
<section class="upload">
<div class="for-DragDrop" x-ref="input"></div>
<div class="for-ProgressBar"></div>
<div class="uploaded-files">
<h5>{{ __('Uploaded file:') }}</h5>
<ol></ol>
</div>
</section>
</x-input.uppy.s3>
插件
用户界面元素
可以使用plugins属性关联数组来添加UI元素,其中键应该是UI元素的相同名称(例如,StatusBar元素的键是StatusBar),值是要传递给UI元素的JS选项。
UI元素插件
- 状态栏
- 进度条
- 拖拽目标
- 通知器
- 图像编辑器
- 缩略图生成器
例如:
@php
$plugins = [
'StatusBar' => "{ target: '.upload .for-ProgressBar', hideAfterFinish: false }",
];
@endphp
<x-input.uppy.s3-multipart
...
:plugins="$plugins"
>
...
源
使用plugins属性关联数组定义用于上传的源。
源插件
- 网络摄像头
- 音频
- 屏幕捕获
例如:
@php
$plugins = [
'Audio' => "{ target: '#dashboard' }",
];
@endphp
<x-input.uppy.s3-multipart
...
:plugins="$plugins"
>
...
其他
可以使用组件的plugins属性关联数组添加其他其他插件。
其他插件
- 金毛猎犬
- 压缩器
- 区域设置
- 表单
例如,要使用GoldenRetriever(uppy.use(GoldenRetriever, { serviceWorker: false }))和Compressor(uppy.use(Compressor, { quality: 0.6 }))插件
@php $plugins = [ 'GoldenRetriever' => "{ serviceWorker: false }", 'Compressor' => "{ quality: 0.6 }", ]; @endphp <x-input.uppy.s3-multipart ... :plugins="$plugins" > ... </x-input.uppy.s3-multipart>
事件
将事件定义为PHP属性关联数组(键是事件名称,值是事件的JS内容),然后传递给events属性。
@php $events = [ 'upload-success' => " const url = response.uploadURL; const fileName = file.name; const aleatorio = 1; const uploadedFileData = JSON.stringify(response.body); const li = document.createElement('li'); const a = document.createElement('a'); a.href = url; a.target = '_blank'; a.appendChild(document.createTextNode(fileName)); li.appendChild(a); document.querySelector('.upload .uploaded-files ol').appendChild(li); var inputElementUrlUploadFile = document.getElementById('file2'); inputElementUrlUploadFile.value = url; inputElementUrlUploadFile.dispatchEvent(new Event('input')); ", ]; @endphp <x-input.uppy.s3 ... :events="$events" > ... </x-input.uppy.s3>
添加额外的JS代码
可以使用extraJs属性添加一些额外的JS代码。
变更日志
请参阅变更日志以获取有关最近更改的更多信息。
贡献
请参阅贡献指南以获取详细信息。
安全漏洞
如果您发现任何与安全相关的问题,请通过电子邮件security@tappnetwork.com联系。
鸣谢
本软件包中使用的库
许可
MIT许可(MIT)。请参阅许可文件以获取更多信息。