Laravel validator and excel files error

38,163

Solution 1

Ok, my fault. I had tried another solution, found on this website and it worked. Thanks for help Odin. It was my first question on this website. I am gonna see if I can help someone now. I post code for solution for someone in need :).

$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',
  ]
);

Solution 2

Use "mimes" when you want to write an extentions (xlsx,doc,docx). In case when use mime-type like application/vnd.ms-excel you must use validation rule mimetype

More mime types: 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'
]);

Solution 3

Here's how I did it in Laravel 6 by checking the file extension.

Create a new validation rule:

php artisan make:rule ExcelRule

Here is the ExcelRule, which checks the file extension:

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.';
    }
}

As you can see, I'm checking for csv, xls, or xlsx here. You can add any additional extensions you desire.

Using it in a controller:

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!');
}

Solution 4

First tell that this is not the proper solution. But you can try this.

I've searched also for that and having so much trouble validating excel file and their mimes type is not working for that unfortunately.

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..!!');
   }
}

in namspace include must use File;

You can validate any file by this way, Thanks.

Solution 5

In Laravel you can use validate the file upload with extension using After Hooks. Read more from 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;
}
Share:
38,163
Exarkun
Author by

Exarkun

Updated on September 15, 2021

Comments

  • Exarkun
    Exarkun over 2 years

    I have an input field who allaow peoples to upload files. I want that they can upload, word files like doc, and files like csv,xlsx.

    When i try with a .doc no problem at all but when i try with an excel files, the validator fail and say that not the good extension.

    Here you can see my code, the two lines of comments was an other solution i have try , and it don't work too :(.

    Any help is welcome.

    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);
       }
    
  • Exarkun
    Exarkun about 7 years
    Thanks for answer , but i have already tried this two solutions ; and its the same thing.When i try to upload a .xlsx or a .csv , the validator fail.
  • Exarkun
    Exarkun over 6 years
    I have found a solution you can see the last answer , its work :)
  • Simion
    Simion over 4 years
    This solution worked for me. Well validation (by mimetypes) of .xls, .xlsx, .ods files. However, one exception. It can not validate .xls and .xlsx files that are made with libreoffice.