source

pdf 파일 다운로드를 위한 PHP 헤더 수정

manycodes 2022. 10. 27. 23:03
반응형

pdf 파일 다운로드를 위한 PHP 헤더 수정

사용자가 링크를 클릭했을 때 응용 프로그램이 PDF를 열도록 하는 데 어려움을 겪고 있습니다.

지금까지 앵커 태그는 다음과 같은 헤더를 송신하는 페이지로 리다이렉트 됩니다.

$filename='./pdf/jobs/pdffile.pdf;

$url_download = BASE_URL . RELATIVE_PATH . $filename;

header("Content-type:application/pdf");
header("Content-Disposition:inline;filename='$filename");
readfile("downloaded.pdf");

이것은 효과가 없는 것 같습니다만, 과거에 이 문제를 해결한 사람이 있습니까?

w3schools의 예 2는 여러분이 달성하려고 하는 것을 보여줍니다.

<?php
header("Content-type:application/pdf");

// It will be called downloaded.pdf
header("Content-Disposition:attachment;filename='downloaded.pdf'");

// The PDF source is in original.pdf
readfile("original.pdf");
?>

그리고 기억하세요.

실제 출력이 전송되기 전에 header()를 호출해야 한다는 점에 유의하십시오(PHP 4 이후에는 출력 버퍼링을 사용하여 이 문제를 해결할 수 있습니다).

$name = 'file.pdf';
//file_get_contents is standard function
$content = file_get_contents($name);
header('Content-Type: application/pdf');
header('Content-Length: '.strlen( $content ));
header('Content-disposition: inline; filename="' . $name . '"');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
echo $content;

당신의 코드에 고려해야 할 사항이 몇 가지 있습니다.

먼저, 그 머리글을 정확하게 쓰세요.송신하는 서버는 표시되지 않습니다.Content-type:application/pdf헤더는 다음과 같습니다.Content-Type: application/pdf, 띄어쓰기로, 첫 글자를 대문자로 쓴다.

의 파일명Content-Disposition파일 이름뿐이며, 파일로의 전체 경로가 아닙니다.필수인지 아닌지는 모르겠지만, 이 이름은 항상 로 둘러싸여 있습니다."것은 아니다.'그리고 당신의 마지막'가 없습니다.

Content-Disposition: inline는 파일을 다운로드가 아닌 표시해야 함을 나타냅니다.사용하다attachment대신.

또한 파일 확장자를 대문자로 입력하여 일부 모바일 디바이스와 호환되도록 합니다.(갱신: Blackberry만 이 문제가 발생했지만 세상은 이미 이러한 문제에서 벗어났기 때문에 더 이상 걱정할 필요가 없습니다.

어쨌든 코드는 다음과 같이 되어 있습니다.코드는 다음과 같습니다.

<?php

    $filename = './pdf/jobs/pdffile.pdf';

    $fileinfo = pathinfo($filename);
    $sendname = $fileinfo['filename'] . '.' . strtoupper($fileinfo['extension']);

    header('Content-Type: application/pdf');
    header("Content-Disposition: attachment; filename=\"$sendname\"");
    header('Content-Length: ' . filesize($filename));
    readfile($filename);

엄밀히 말하면Content-Length는 옵션이지만 사용자가 다운로드 진행 상황을 추적하고 다운로드가 종료되기 전에 중단되었는지 여부를 검출할 수 있도록 하는 것이 중요합니다.사용할 때는 파일 데이터와 함께 아무것도 보내지 않도록 해야 합니다.그 전에 아무것도 없는 것을 확인해 주세요.<?php또는 그 후?>빈 줄도 없습니다.

최근에도 같은 문제가 있었습니다.이것이 도움이 되었습니다.

    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="FILENAME"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize("PATH/TO/FILE")); 
    ob_clean(); 
    flush(); 
    readfile(PATH/TO/FILE);      
    exit();

나는 여기서 이 을 찾았다.

이거 한번 먹어볼래?readfile전체 파일 경로가 필요합니다.

        $filename='/pdf/jobs/pdffile.pdf';            
        $url_download = BASE_URL . RELATIVE_PATH . $filename;            

        //header("Content-type:application/pdf");   
        header("Content-type: application/octet-stream");                       
        header("Content-Disposition:inline;filename='".basename($filename)."'");            
        header('Content-Length: ' . filesize($filename));
        header("Cache-control: private"); //use this to open files directly                     
        readfile($filename);

파일 크기를 정의해야 합니다...

header('Content-Length: ' . filesize($file));

그리고 이 행은 틀렸습니다.

헤더("Content-Disposition:inline;filename='$filename");

할당량을 망쳤어요.

header("Content-type:application/pdf");

// It will be called downloaded.pdf thats mean define file name would be show

header("Content-Disposition:attachment;filename=  $fileName  ");

// The PDF source is in original.pdf

readfile($file_url);

언급URL : https://stackoverflow.com/questions/20080341/correct-php-headers-for-pdf-file-download

반응형