一个灵活的文件上传组件,内置拖放支持、文件预览和 Livewire 集成,用于处理应用程序中的文件上传。
 
            <flux:file-upload wire:model="photos" multiple label="Upload files">    <flux:file-upload.dropzone        heading="Drop files here or click to browse"        text="JPG, PNG, GIF up to 10MB"    /></flux:file-upload><div class="mt-4 flex flex-col gap-2">    <flux:file-item        heading="Profile_pic.jpg"        image="https://fluxui.dev/img/demo/user.png"        size="162400"    >        <x-slot name="actions">            <flux:file-item.remove />        </x-slot>    </flux:file-item></div>要获得更紧凑的界面,请在拖放区域上使用 inline 属性来创建占用较少垂直空间的水平布局。
<flux:file-upload wire:model="photos" multiple label="Upload files">    <flux:file-upload.dropzone        heading="Drop files or click to browse"        text="JPG, PNG, GIF up to 10MB"        inline    /></flux:file-upload><div class="mt-3 flex flex-col gap-2">    <flux:file-item heading="Profile_pic.jpg">        <x-slot name="actions">            <flux:file-item.remove />        </x-slot>    </flux:file-item>    <flux:file-item heading="Brand_banner.jpg">        <x-slot name="actions">            <flux:file-item.remove />        </x-slot>    </flux:file-item></div>在拖放区域上使用 with-progress 属性来在文件上传时显示进度指示器。
<flux:file-upload wire:model="photos" multiple label="Upload files">    <flux:file-upload.dropzone        heading="Drop files or click to browse"        text="JPG, PNG, GIF up to 10MB"        with-progress        inline    /></flux:file-upload>使用 with-progress 时,组件提供了两个 CSS 变量,您可以用于自定义进度实现:
这些变量在上传过程中会自动更新,可以在您的自定义 CSS 中使用,以创建进度条、圆形指示器或您需要的任何其他视觉反馈。
使用 disabled 属性来阻止用户与文件上传组件的交互。禁用时,拖放区域变为不可点击,拖放功能被禁用,UI 显示为静音状态以表示其处于非活动状态。
<flux:file-upload wire:model="photos" multiple label="Upload files" disabled>    <flux:file-upload.dropzone        heading="Drop files or click to browse"        text="JPG, PNG, GIF up to 10MB"        inline    /></flux:file-upload>flux:file-upload 包装器处理所有复杂的文件上传功能 - 拖放、文件选择和上传进度。您可以在其中放置任何自定义 HTML 来完全自定义外观,同时保持所有上传行为。
这是一个自定义头像上传器的示例:
<flux:file-upload wire:model="photo">    <!-- Custom avatar uploader -->    <div class="        relative flex items-center justify-center size-20 rounded-full transition-colors cursor-pointer        border border-zinc-200 dark:border-white/10 hover:border-zinc-300 dark:hover:border-white/10        bg-zinc-100 hover:bg-zinc-200 dark:bg-white/10 hover:dark:bg-white/15 in-data-dragging:dark:bg-white/15    ">        <!-- Show the uploaded file if it exists -->        @if ($photo)            <img src="{{ $photo?->temporaryUrl() }}" class="size-full object-cover rounded-full" />        @else            <!-- Show the default icon if no file is uploaded -->            <flux:icon name="user" variant="solid" class="text-zinc-500 dark:text-zinc-400" />        @endif        <!-- Corner upload icon -->        <div class="absolute bottom-0 right-0 bg-white dark:bg-zinc-800 rounded-full">            <flux:icon name="arrow-up-circle" variant="solid" class="text-zinc-500 dark:text-zinc-400" />        </div>    </div></flux:file-upload>文件上传包装器自动提供数据属性,您可以使用这些属性来设置自定义上传器的样式:
可以使用 in-data-dragging: 和 in-data-loading: 实用程序前缀通过 CSS 定位这些属性,以在拖拽和上传状态期间创建动态视觉反馈。
文件上传组件与 Livewire 的文件上传功能无缝集成。使用 wire:model 指令将上传的文件绑定到您的 Livewire 组件属性。
对于单文件上传,直接绑定到属性并处理上传文件的显示和删除。
use Livewire\Component;use Livewire\WithFileUploads;use Livewire\Attributes\Validate;class FileUpload extends Component {    use WithFileUploads;    #[Validate('image|max:10240')] // 10MB Max    public $photo;    public function removePhoto()    {        $this->photo->delete();        $this->photo = null;    }    public function save()    {        $this->photo->store(path: 'photos');        return $this->redirect('...');    }}<!-- Blade view: --><form wire:submit="save">    <flux:file-upload wire:model="photo" label="Upload file">        <flux:file-upload.dropzone heading="Drop file here or click to browse" text="JPG, PNG, GIF up to 10MB" />    </flux:file-upload>    <div class="mt-3 flex flex-col gap-2">        @if ($photo)            <flux:file-item                :heading="$photo->getClientOriginalName()"                :image="$photo->temporaryUrl()"                :size="$photo->getSize()"            >                <x-slot name="actions">                    <flux:file-item.remove wire:click="removePhoto" aria-label="{{ 'Remove file: ' . $photo->getClientOriginalName() }}" />                </x-slot>            </flux:file-item>        @endif    </div>    <flux:button type="submit">Save</flux:button></form>通过使用数组属性和 multiple 属性来处理多文件上传。
use Livewire\Component;use Livewire\WithFileUploads;use Livewire\Attributes\Validate;class FileUpload extends Component {    use WithFileUploads;    #[Validate(['photos.*' => 'image|max:1024'])]    public $photos = [];    public function removePhoto($index)    {        $photo = $this->photos[$index];        $photo->delete();        unset($this->photos[$index]);        $this->photos = array_values($this->photos);    }    public function save()    {        foreach ($this->photos as $photo) {            $photo->store(path: 'photos');        }        return $this->redirect('...');    }}<!-- Blade view: --><form wire:submit="save">    <flux:file-upload wire:model="photos" label="Upload files" multiple>        <flux:file-upload.dropzone heading="Drop files here or click to browse" text="JPG, PNG, GIF up to 10MB" />    </flux:file-upload>    <div class="mt-3 flex flex-col gap-2">        @foreach ($photos as $index => $photo)            <flux:file-item                :heading="$photo->getClientOriginalName()"                :image="$photo->temporaryUrl()"                :size="$photo->getSize()"            >                <x-slot name="actions">                    <flux:file-item.remove wire:click="removePhoto({{ $index }})" aria-label="{{ 'Remove file: ' . $photo->getClientOriginalName() }}" />                </x-slot>            </flux:file-item>        @endforeach    </div>    <flux:button type="submit">Save</flux:button></form>包装上传功能并与表单字段集成的主要文件上传容器组件。
| 属性 | 描述 | 
|---|---|
| name | 表单提交的输入名称属性。 | 
| multiple | 如果存在,允许选择和上传多个文件。默认值:false。 | 
| label | 显示在上传区域上方的字段标签文本。 | 
| description | 显示在字段下方的帮助文本。 | 
| error | 验证失败时显示的错误消息。 | 
| disabled | 如果存在,阻止用户与文件上传的交互。默认值:false。 | 
| Livewire 指令 | 描述 | 
|---|---|
| wire:model | 将文件上传绑定到 Livewire 属性以处理上传的文件。 | 
| 数据属性 | 描述 | 
|---|---|
| data-dragging | 当文件被拖拽到组件上时自动添加。与 Tailwind 的 in-data-dragging: 前缀一起使用进行样式设置。 | 
| data-loading | 在文件上传过程中自动添加。与 Tailwind 的 in-data-loading: 前缀一起使用进行样式设置。 | 
用户可以拖放文件或点击浏览文件的可视化拖放区域。
| 属性 | 描述 | 
|---|---|
| heading | 在拖放区域中显示的主要文本。 | 
| text | 显示在标题下方的支持文本(例如,文件类型和大小限制)。 | 
| icon | 在拖放区域中显示的图标名称。默认值: cloud-arrow-up. | 
| inline | 如果存在,以紧凑的水平布局显示拖放区域。默认值: false. | 
| with-progress | 如果存在,在文件上传期间显示进度条而不是仅显示加载旋转器。需要 text 属性被定义。默认值: false. | 
| CSS 变量 | 描述 | 
|---|---|
| --flux-file-upload-progress | 上传进度百分比(例如,"42%")。使用 with-progress时存在. | 
| --flux-file-upload-progress-as-string | 上传进度作为引用字符串 (e.g., "'42%'"). 使用 with-progress时存在. | 
| 数据属性 | 描述 | 
|---|---|
| data-dragging | 当文件被拖拽到拖放区域上时出现在文件上传元素上。 | 
| data-loading | 在文件上传过程中出现在文件上传元素上。 | 
显示上传的文件,包含可选的预览图像、文件详情和操作。
| 属性 | 描述 | 
|---|---|
| heading | 要显示的文件名或标题。 | 
| text | 要显示的附加文本(如果未提供,则从大小自动计算)。 | 
| image | 文件预览图像的 URL 或路径。 | 
| size | 文件大小(以字节为单位)。自动格式化为 B、KB、MB 或 GB。 | 
| icon | 未提供图像时显示的图标。默认值: document. | 
| invalid | 如果存在,以错误状态显示文件项。默认值: false. | 
| 插槽 | 描述 | 
|---|---|
| actions | 用于操作按钮(如删除、下载或预览)的插槽。 | 
用于文件项的预设样式删除按钮,可以连接到删除操作。
| Livewire 指令 | 描述 | 
|---|---|
| wire:click | 点击时触发 Livewire 方法来删除文件。 | 
| aria-label | 删除按钮使用的 aria-label。 |