programing

Larravel validator 및 Excel 파일 오류

oldcodes 2023. 9. 11. 22:14
반응형

Larravel validator 및 Excel 파일 오류

사람들이 파일을 업로드 할 수 있게 해주는 입력란이 있습니다.나는 그들이 업로드 할 수 있기를 바랍니다, doc 같은 word 파일, csv, xlsx 같은 파일.

.doc으로 시도하면 전혀 문제가 없지만 엑셀 파일로 시도하면 validator가 실패하고 확장자가 좋지 않다고 말합니다.

여기 제 코드를 보실 수 있습니다. 댓글 두 줄은 제가 시도한 또 다른 해결책이었고, 그것도 작동하지 않습니다 :(.

어떤 도움이라도 환영합니다.

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

알았어, 내 잘못.다른 해결책을 시도해봤는데 이 웹사이트에서 찾았고 효과가 있었습니다.오딘을 도와줘서 고맙습니다.이 웹사이트에서의 첫 질문이었습니다.제가 지금 누군가를 도울 수 있는지 알아보겠습니다.도움이 필요한 사람을 위해 해결 코드를 올립니다 :).

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

확장자(xlsx, doc, docx)를 쓰려면 "mimes"를 사용합니다.mime-type like application/vnd.ms -mime-type을 사용하는 경우 검증 규칙 mime-type을 사용해야 합니다.

추가 마임 유형: 추가 마임 유형

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

파일 확장자를 확인하여 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.';
    }
}

보시다시피, 제가 확인하고 있는 것은csv,xls, 아니면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!');
}

다음 내용:

'file' => 'required|mimes:xlsx, xls',

이 내용을 입력하는 것을 잊어버려서 작동하지 않을 수 있습니다.

enctype="multipart/form-data"

html 양식 태그에!

우선 이것은 적절한 해결책이 아니라고 말합니다.근데 이거 먹어봐도 돼요.

그것도 찾아봤는데 확인하는 데 너무 어려움을 겪고 있습니다.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에서는 must를 포함합니다.use File;

어떤 파일이든 이런 식으로 검증할 수 있습니다. 감사합니다.

Laravel에서는 After Hooks를 사용하여 확장명으로 파일 업로드 유효성을 검사할 수 있습니다.여기서 더 읽어보세요!

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

단순한 해결책은 마임을 사용하는 것입니다.

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

laravel에서 제공하는 validator를 사용해 보았지만 모두 작동하지 않는 것 같습니다.그것은 나에게 일반 php를 사용하여 검증을 시도할 아이디어를 주었고 그것은 참처럼 작동합니다.

$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
}

그거에요!내가 직접 해봤는데 네가 테스트만 하면mimes:csv파일 이름에 공백이 있으면 실패합니다.

제가 검증을 통과하기 위해 한 일은required|mimes:csv,txt.

하지만 이미 제안하신 대로 수동 검증을 해야 합니다.

프론트 엔드 유효성 검사는 사용자 환경과 관련하여 좋은 점이지만, 서버와 다른 시스템에서 실행되는 유효성 검사만으로는 절대 신뢰할 수 없습니다.자바스크립트 유효성 검사를 하려면 항상 서버에서 다시 유효성 검사를 합니다.

귀하의 경우 잘못된 형식이 아닌 비정상적인 파일 이름에 대한 예외이므로 mimes:csv,txt를 사용하여 mime-type 유효성 검사를 완화한 다음 패키지를 사용하여 CSV 파일을 구문 분석합니다. 일반적으로 이 패키지는 형식이 유효하지 않을 때 예외를 발생시킵니다.

CSV를 처리하기 위한 두 가지 훌륭한 패키지는 다음과 같습니다.

[ https://github.com/Maatwebsite/Laravel-Excel ] [ http://csv.thephpleague.com/ ] 도움이 되길 바랍니다.

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

언급URL : https://stackoverflow.com/questions/42089659/laravel-validator-and-excel-files-error

반응형