본문 바로가기
기타

A태그 클릭 시 파일다운로드 처리하기

by zgabriel 2025. 4. 17.
728x90

웹페이지에서 A 태그 링크를 클릭했을 때 파일다운로드 처리하고자 한다.

 

파일이 같은 서버에 있어서 URL 이 동일할 경우 A 태그 옵션인 download 를 사용하면 된다고 하는데

 

불행히도 같은 서버가 아닌 원격서버에서 다운로드 할 경우이다. 

 

방법은 a 태그 클릭 시 실행 할 페이지를 만들어 아래처럼 코딩해주면 된다. 

 

//원격에 있는 파일다운로드 처리 (FOPEN) ------------------------------------------------------------
$fileUrl = 'https://test.com/test.mp4';
$fileName = pathinfo($fileUrl, PATHINFO_BASENAME);

// 원격 파일 열기
$remoteStream = fopen($fileUrl, 'rb');
if (!$remoteStream) {
    die('원격 파일을 열 수 없습니다.');
}

// 헤더 설정 (다운로드 강제)
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');

// 원격 파일을 출력 스트림으로 복사
fpassthru($remoteStream);
fclose($remoteStream);

exit;

//원격에 있는 파일다운로드 처리 (CURL) ------------------------------------------------------------
$fileUrl = 'https://test.com/test.mp4';
$fileName = pathinfo($fileUrl, PATHINFO_BASENAME);

// 원격 파일 열기
$remoteStream = fopen($fileUrl, 'rb');
if (!$remoteStream) {
    die('원격 파일을 열 수 없습니다.');
}

// 헤더 설정 (다운로드 강제)
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');

// 원격 파일을 출력 스트림으로 복사
fpassthru($remoteStream);
fclose($remoteStream);

//로컬에 있는 파일다운로드  ------------------------------------------------------------
$filePath = 'path/to/video.mp4';
$fileName = 'video.mp4';

if (file_exists($filePath)) {
    // 다운로드 강제 헤더 설정
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream'); // 또는 video/mp4
    header('Content-Disposition: attachment; filename="' . basename($fileName) . '"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($filePath));

    // 파일 읽어서 전송
    readfile($filePath);
    exit;
} else {
    echo "파일이 존재하지 않습니다.";
}