본문으로 바로가기

라라벨 파일 다운로드 샘플

category 카테고리 없음 2024. 9. 15. 15:36

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