web-dev-qa-db-ja.com

LaravelバリデータとExcelファイルのエラー

人々にファイルのアップロードを許可する入力フィールドがあります。私は彼らがdocのようなWordファイルとcsv、xlsxのようなファイルをアップロードできることを望んでいます。

.docで試してもまったく問題ありませんが、Excelファイルで試してみると、バリデーターは失敗し、適切な拡張子ではないと言います。

ここで私のコードを見ることができます。2行のコメントは私が試したもう1つの解決策でしたが、うまくいきません:(。

どんな助けでも大歓迎です。

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

はい、私のせいです。私はこのウェブサイトで見つけた別の解決策を試しましたが、うまくいきました。オーディンを助けてくれてありがとう。このウェブサイトでの最初の質問でした。私は誰かを今助けることができるかどうかを見るつもりです。私は困っている人のための解決策のコードを投稿します:)。

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

拡張機能を記述したい場合は、「mimes」を使用します(xlsx、doc、docx)。 application/vnd.ms-Excelのようなmime-typeを使用する場合、検証ルール mimetype を使用する必要があります

その他のMIMEタイプ: その他のMIMEタイプ

$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'
]
5
Odin Thunder

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

ご覧のとおり、ここでcsvxls、またはxlsxを確認しています。必要に応じて追加の拡張機能を追加できます。

コントローラでそれを使用する:

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

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;
}
1
Prabakaran T

最初これは適切な解決策ではないことを伝えます。しかし、これを試すことができます。

私もそれを検索しましたが、検証に非常に苦労しましたExcel fileとそのMIMEタイプは残念ながら機能しません。

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

ネームスペースにインクルードする必要がありますuse File;

この方法でファイルを検証できます、ありがとうございます。

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
}
0
Godson Mandla