Laravel验证器和excel文件错误

时间:2017-02-07 12:15:14

标签: php excel laravel validation csv

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

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

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

欢迎任何帮助。

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

7 个答案:

答案 0 :(得分:7)

好的,我的错。 我在这个网站上尝试了另一种解决方案,但它确实有用。 谢谢你的帮助奥丁。 这是我在这个网站上的第一个问题,我会看看我现在是否可以帮助别人。 我在某人需要时提出解决方案的代码:)。

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

答案 1 :(得分:4)

如果要编写扩展名( xlsx,doc,docx ),请使用“mimes”。 如果使用像 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'
]

答案 2 :(得分:3)

这是我在Laravel 6中通过检查文件扩展名来完成的操作。

创建新的验证规则:

for x in link:
driver.get(x)
try:

    names = driver.find_elements_by_css_selector("td")
    i = 0
    while i <= len(names):
        address = names[i].text.splitlines()
        r = len(address)

        if r == 4:
            print(x, " | ",address[0], " | ", address[1], " | ", address[2], " | ", address[3])


        elif r == 3:

            print(x, " | ",address[0], " | ", address[1], " | ", address[2])

        else:
            pass
        i=i+1


except(NoSuchElementException, IndexError):
    continue

这里是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.'; } } csvxls。您可以添加所需的任何其他扩展。

在控制器中使用它:

xlsx

答案 3 :(得分:1)

在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;
}

答案 4 :(得分:0)

首先告诉 这不是正确的解决方案 。但你可以试试这个。

我也搜索了这一点并且在验证excel file时遇到了很多麻烦,并且不幸的是他们的哑剧类型不适用于此。

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 :(得分:0)

我尝试了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
}

答案 6 :(得分:0)

就是这样!我亲自尝试过,如果您仅测试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]