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