Laravel에서 파일 액세스를 요청하는 대기열 작업
P粉762447363
2023-09-03 13:43:56
<p>안녕하세요 여러분, 사용자가 가져온 파일을 통해 데이터베이스에 일부 레코드를 삽입하기 위해 대기 중인 Laravel 작업이 있습니다. 하지만 업로드된 파일을 가져오기 위해 작업의 요청 개체에 액세스할 때마다 null이 발생합니다. 그러나 파일은 컨트롤러에서 정상적으로 수신됩니다. 어떤 아이디어가 있나요? </p>
<p>다음과 같이 컨트롤러에서 가져오기 방법을 찾으세요. </p>
<pre class="brush:php;toolbar:false;">공개 함수 가져오기(ImportPointRequest $request)
{
저장소::makeDirectory('import_logs');
$file = 요청()->file('파일');
$fileName = 'importlog_date_' . 날짜('Y-m-d') . auth()->id() .
$log파일 = '가져오기_로그/' .
$readerTypes = ['xlsx' => 엑셀::XLSX, 'xls' => 엑셀::XLS, 'csv' =>
$link = 경로('file.show', ['import_logs', $fileName]);
노력하다 {
ExcelFacade::import(new PointsImportHeading(), $file);
} 잡기(예외 $e) {
return $this->returnBadRequest(config('point.error-codes.import-fail'), $e->getMessage());
}
(new PointsImport(auth()->user(), auth()->user()->account_id, $logFile))->queue(
$file->getRealPath(),
없는,
$readerTypes[request()->file('file')->getClientOriginalExtension()]
)->chain([new AfterImportJob(auth()->id(), $logFile, $link)]);
return $this->returnSuccess(trans('point::point.import-queued', ['module' => trans('point::point.point')]));
}</pre>
<p>다음과 같이 작업에서 getImportedFileContent 메소드를 찾으세요. </p>
<pre class="brush:php;toolbar:false;">보호된 함수 getUploadedFileContent(): 배열
{
return Excel::toArray(new PointsImportHeading(), request()->file('file'));
}</pre>
<p>문제는 이 <code>request()->file('file')</code> 부분이 항상 null을 반환한다는 것입니다. </p>
방법이 잘못되었습니다. Laravel에서 요청의 수명주기는 요청이 서버에 도착할 때 시작되고 응답이 사용자의 브라우저로 다시 전송될 때 끝납니다. Laravel에서 작업을 대기열에 추가한다는 것은 해당 작업이 나중에 처리된다는 의미입니다. 어쩌면 다른 서버에서도 처리될 수도 있습니다. 작업이 실제로 실행되면 원래 요청 수명 주기가 종료됩니다. 따라서 대기 중인 작업 내의 요청 데이터에 액세스할 수 없습니다.
대기 중인 작업에서 업로드된 파일을 사용해야 하는 경우 해당 작업이 액세스할 수 있는 위치에 업로드된 파일을 저장해야 합니다. 이는 서버의 파일 시스템일 수도 있고 클라우드 스토리지 서비스일 수도 있습니다.
컨트롤러에 Excel로 처리하기 위해 파일을 임시로 저장했습니다.
으아악그러나 지속된 파일이 없기 때문에 작업이 실행되는 동안 파일을 사용할 수 없습니다. 좀 더 영구적인 곳에 파일을 저장해야 합니다.
파일을 영구 저장한 후 새 위치에서 파일을 읽을 수 있습니다.