Laravel 验证器和 excel 文件错误

Posted

技术标签:

【中文标题】Laravel 验证器和 excel 文件错误【英文标题】:Laravel validator and excel files error 【发布时间】:2017-06-24 16:27:49 【问题描述】:

我有一个允许人们上传文件的输入字段。 我希望他们可以上传,像 doc 这样的 word 文件,以及像 csv、xlsx 这样的文件。

当我尝试使用 .doc 时完全没有问题,但是当我尝试使用 excel 文件时,验证器失败并说这不是好的扩展名。

在这里你可以看到我的代码,两行 cmets 是我尝试过的另一个解决方案,但它也不起作用:(。

欢迎任何帮助。

public function postFile(Request $request)
 //Règle de validation avec les type de fichiers acceptés

 if(isset($request->file))
//dd($request);
   $validator=Validator::make($request->all(),[
     'file'=>'required|max:50000|mimes:xlsx,doc,docx,ppt,pptx,ods,odt,odp,application/csv,application/excel,
      application/vnd.ms-excel, application/vnd.msexcel,
      text/csv, text/anytext, text/plain, text/x-c,
      text/comma-separated-values,
      inode/x-empty,
      application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  /*  'extension'  => strtolower($request->file->getClientOriginalExtension()),
     'extension'=>'required|in:doc,csv,xlsx,xls,docx,ppt,odt,ods,odp'*/
   ]);
  if ($validator->fails()) 
     return back()
                ->withErrors($validator);
   

【问题讨论】:

请注意,文件不是空的,我在尝试使用空文件时浪费了 4 个小时 【参考方案1】:

好吧,我的错。 我尝试了另一种解决方案,在这个网站上找到并且它有效。 感谢奥丁的帮助。 这是我在这个网站上的第一个问题。我现在要看看我能不能帮助别人。 我为有需要的人发布了解决方案的代码:)。

$validator = Validator::make(
  [
      'file'      => $request->file,
      'extension' => strtolower($request->file->getClientOriginalExtension()),
  ],
  [
      'file'          => 'required',
      'extension'      => 'required|in:doc,csv,xlsx,xls,docx,ppt,odt,ods,odp',
  ]
);

【讨论】:

【参考方案2】:

当你想写扩展时使用“mimes”(xlsx,doc,docx)。 如果使用像 application/vnd.ms-excel 这样的 mime 类型,则必须使用验证规则 mimetype

更多 mime 类型:more mime-types

$validator=Validator::make($request->all(),[
 //use this
    'file'=>'required|max:50000|mimes:xlsx,doc,docx,ppt,pptx,ods,odt,odp'
 //or this
    'file'=>'required|max:50000|mimetypes:application/csv,application/excel,
        application/vnd.ms-excel, application/vnd.msexcel,
        text/csv, text/anytext, text/plain, text/x-c,
        text/comma-separated-values,
        inode/x-empty,
        application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
]);

【讨论】:

感谢您的回答,但我已经尝试过这两种解决方案;和它是一回事。当我尝试上传 .xlsx 或 .csv 时,验证器失败。 这个解决方案对我有用。 .xls、.xlsx、.ods 文件的良好验证(通过 mimetypes)。然而,一个例外。它无法验证使用 libreoffice 制作的 .xls 和 .xlsx 文件。【参考方案3】:

这是我在 Laravel 6 中通过检查文件扩展名的方法。

创建新的验证规则:

php artisan make:rule ExcelRule

这里是ExcelRule,它检查文件扩展名:

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Http\UploadedFile;

class ExcelRule implements Rule

    private $file;

    public function __construct(UploadedFile $file)
    
        $this->file = $file;
    

    public function passes($attribute, $value)
    
        $extension = strtolower($this->file->getClientOriginalExtension());

        return in_array($extension, ['csv', 'xls', 'xlsx']);
    

    public function message()
    
        return 'The excel file must be a file of type: csv, xls, xlsx.';
    

如您所见,我在这里检查csvxlsxlsx。您可以添加所需的任何其他扩展。

在控制器中使用它:

public function uploadExcelFile(Request $request)

    $request->validate([
        'excel_file' => ['required', new ExcelRule($request->file('excel_file'))],
    ]);

    $model->update([
        'excel_file' => $request->file('excel_file')->store('excel_files'),
    ]);

    return redirect()->route('my_route_name')->with('Excel file uploaded!');

【讨论】:

【参考方案4】:

首先说明这不是正确的解决方案。不过你可以试试这个。

我也对此进行了搜索,但在验证 excel file 时遇到了很多麻烦,不幸的是,他们的 mimes 类型无法正常工作。

if($request->hasFile('file'))

   $extension = File::extension($request->file->getClientOriginalName());
   if ($extension == "xlsx" || $extension == "xls" || $extension == "csv") 
      //'Your file is a valid xls or csv file'
   else 
      //'File is a '.$extension.' file.!! Please upload a valid xls/csv file..!!');
   

在 namspace 中必须包含 use File;

您可以通过这种方式验证任何文件,谢谢。

【讨论】:

我找到了一个解决方案,你可以看到最后一个答案,它的工作:)【参考方案5】:

在 Laravel 中,您可以使用 After Hooks 验证文件上传的扩展名。阅读更多来自here!

$validator->after(function ($validator) use ($request)
    if($this->checkExcelFile($request->file('file')->getClientOriginalExtension()) == false) 
        //return validator with error by file input name
        $validator->errors()->add('file', 'The file must be a file of type: csv, xlsx, xls');
    
);

function checkExcelFile($file_ext)
    $valid=array(
        'csv','xls','xlsx' // add your extensions here.
    );        
    return in_array($file_ext,$valid) ? true : false;

【讨论】:

【参考方案6】:

我尝试了 laravel 提供的验证器,但似乎都不起作用。这给了我一个尝试使用普通 php 进行验证的想法,它就像一个 cham 一样工作

$extensions = array("xls","xlsx","xlm","xla","xlc","xlt","xlw");

        $result = array($request->file('import_file')->getClientOriginalExtension());

if(in_array($result[0],$extensions))
// Do something when Succeeded 
else
 // Do something when it fails

【讨论】:

【参考方案7】:

就是这样!我自己试过,如果你只测试mimes:csv,当文件名有空格时它会失败。

我通过验证所做的是使用required|mimes:csv,txt

但正如您已经建议的那样,您需要进行一些手动验证。

前端验证在用户体验方面是一件好事,但您永远不能只相信在与您的服务器不同的机器上运行的验证。如果您要进行任何 javascript 验证,请始终在服务器中再次验证它。

在你的情况下,因为它是一个不寻常的文件名的例外,而不是错误的格式,我会使用 mimes:csv,txt 放宽 mime 类型验证,然后使用一个包来解析 CSV 文件,通常是这个包当格式无效时引发异常。

处理 CSV 的两个很棒的包是:

[https://github.com/Maatwebsite/Laravel-Excel] [http://csv.thephpleague.com/] 希望对您有所帮助。

[https://laracasts.com/discuss/channels/general-discussion/csv-file-upload-request-validation]

【讨论】:

【参考方案8】:

简单的解决方案是使用 mime

 $request->validate([
    'file'=> 'required|mimes:xlsx, csv, xls'
 ]);

【讨论】:

以上是关于Laravel 验证器和 excel 文件错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Excel - 导入日期验证

Laravel 8.65 验证错误消息和旧值未显示在 Blade 文件中

Laravel 5 文件上传验证

Laravel 8 - 旧输入和验证错误消息不起作用

如果字段是输入类型文件,laravel 中的 required_if 验证不会给出错误

Laravel 5.5 文件扩展验证不起作用