Laravel Livewire上传.csv文件自动转为.txt文件,该如何修复?
Livewire上传CSV文件自动转为TXT格式问题
问题描述
尝试从Excel类文件中导入数据,在使用Livewire上传.csv格式文件时,文件被自动转换为.txt格式,暂无法确认问题出自Livewire还是Laravel框架。
相关代码
文件导入模态框代码
<x-jet-modal maxWidth="sm" wire:model="showImportDialog"> <form wire:submit.prevent="import" method="POST" enctype="multipart/form-data"> <div> <div class="text-lg">Import Users</div> </div> <div> <input type="file" wire:model="users" name="users" id="users" /> </div> <x-jet-button type="submit">Import</x-jet-button> </form> </x-jet-modal>
对应Livewire组件代码
... use WithFileUploads; public $users; public function import() { dd($this->users); // originalName: "W4K99h75YVHSou815dV0fErWMLzZ75-metaUUNTX1VzZXJzXzIwMjEtMDktMTQgMTdfNDdfNTMuY3N2-.txt" $validated = $this->validate([ 'users.*' => 'required|file|mimes:xls,xlsx,csv', ]); dd($validated); // 输出结果为"[]" } ...
排查补充信息
- 验证前打印
$this->users的结果:
- 更新1:调用
dd($this->users->getClientOriginalName())可正常输出原始文件名Users_2021-09-14 17_47_53.csv - 更新2:Livewire配置文件截图:

问题原因与解决方案
该问题是Livewire处理文件上传的默认逻辑导致,和Laravel框架无关:Livewire存储临时文件时不会保留原始文件后缀,统一采用.txt作为临时文件后缀,仅在请求属性中保留原始文件信息。你使用的mimes校验规则会读取临时文件的后缀判断类型,所以校验失败返回空数组。
修复步骤
- 将验证规则从
mimes改为mimetypes,直接校验文件实际内容的MIME类型:
// 单文件上传校验 $validated = $this->validate([ 'users' => 'required|file|mimetypes:text/csv,text/plain,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ]); // 多文件上传校验保留数组写法 $validated = $this->validate([ 'users.*' => 'required|file|mimetypes:text/csv,text/plain,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ]);
- 后续存储文件时,通过
getClientOriginalName()获取原始文件名,调用storeAs()方法自定义存储的文件名和后缀即可,不会影响实际文件内容的解析。
内容的提问来源于stack exchange,提问作者Mahdi Jafari
相关产品推荐
相关产品推荐

