Laravel의 파일 저장 경로 문제는 storage_path() 함수가 실제로 storage 디렉토리 내부의 경로를 반환하는 반면, 브라우저에서 접근할 수 있는 경로는 public 디렉토리 안에 있어야 하므로 발생합니다. Laravel에서는 기본적으로 storage/app 경로는 외부에서 접근할 수 없기 때문에, 파일을 public 디렉토리 안으로 옮기거나 심볼릭 링크로 접근할 수 있게 해야 합니다.
해결 방법 1: storage/app/temp 디렉토리를 public/storage/temp로 접근 가능하게 만들기
Laravel에서 storage 디렉토리를 공개적으로 접근 가능하게 만드는 방법 중 하나는 심볼릭 링크를 설정하는 것입니다. 이 링크는 storage/app 디렉토리를 public/storage 디렉토리 아래에서 접근할 수 있게 만듭니다.
1. 심볼릭 링크 설정: 먼저, 아래 명령을 터미널에서 실행하여 storage/app 디렉토리를 public/storage 디렉토리 아래로 연결해줍니다.
이 명령을 실행하면 storage/app/public 경로가 public/storage에 연결됩니다.
php artisan storage:link
2. 파일 저장 경로 수정: 파일을 storage/app/temp에 저장하는 대신, public/storage/temp 경로로 이동하도록 코드에서 경로를 수정해야 합니다.
// 엑셀 파일 생성 및 저장
$writer = new Xlsx($spreadsheet);
$fileName = 'DB다운로드_' . date("YmdHis") . '.xlsx';
// 파일을 public/storage/temp 경로에 저장 (공개 가능 경로)
$tempFilePath = public_path('storage/temp/' . $fileName);
$writer->save($tempFilePath);
// JSON 응답에서 파일을 public/storage 경로로 반환
return response()->json([
'msg' => '다운로드가 완료되었습니다.',
'file_path' => url('storage/temp/' . $fileName) // public/storage/temp 경로 반환
], 200);
여기서 public_path() 함수를 사용하여 public 디렉토리 아래의 storage/temp 폴더로 파일을 저장하게 합니다. 이렇게 하면 브라우저가 파일을 접근할 수 있는 경로가 됩니다.
3. JavaScript로 파일 다운로드: AJAX 응답으로 받은 파일 경로를 window.location.href로 처리하여 다운로드를 실행합니다.
$.ajax({
url: '/your-download-route',
type: 'POST',
data: yourData,
success: function(response) {
if (response.file_path) {
window.location.href = response.file_path;
}
},
error: function(error) {
console.error('다운로드 중 오류 발생:', error);
}
});
또는
$.ajax({
url: '/your-download-route',
type: 'POST',
data: yourData,
success: function(response) {
if (response.file_path) {
// 파일 다운로드를 위해 링크 생성
const link = document.createElement('a');
link.href = response.file_path;
link.download = ''; // 파일 이름은 서버에서 처리됨
document.body.appendChild(link);
link.click();
document.body.removeChild(link); // 클릭 후 링크 제거
}
},
error: function(error) {
console.log('다운로드 중 오류 발생:', error);
}
});