복붙노트

PHP를 사용하여 파일을 다운로드하도록 강제 실행

PHP

PHP를 사용하여 파일을 다운로드하도록 강제 실행

내 서버에 CSV 파일이 있습니다. 사용자가 링크를 클릭하면 다운로드해야하지만 브라우저 창에는 열립니다.

내 코드는 다음과 같습니다

<a href="files/csv/example/example.csv">
    Click here to download an example of the "CSV" file
</a>

그것은 내가 개발 한 모든 작업을 수행하는 정상적인 웹 서버입니다.

나는 다음과 같은 것을 시도했다.

<a href="files/csv/example/csv.php">
    Click here to download an example of the "CSV" file
</a>

이제 내 csv.php 파일의 내용 :

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');

이제 내 문제는 다운로드 중이지만 내 CSV 파일은 아닙니다. 새 파일을 만듭니다.

해결법

  1. ==============================

    1.서버에있는 모든 CSV 파일을 무차별 적으로 다운로드하려면 .htaccess 파일을 추가하십시오.

    서버에있는 모든 CSV 파일을 무차별 적으로 다운로드하려면 .htaccess 파일을 추가하십시오.

    AddType application/octet-stream csv
    
    header('Content-Type: application/csv');
    header('Content-Disposition: attachment; filename=example.csv');
    header('Pragma: no-cache');
    readfile("/path/to/yourfile.csv");
    
  2. ==============================

    2.또는 HTML5를 사용하여이 작업을 수행 할 수 있습니다. 간단히

    또는 HTML5를 사용하여이 작업을 수행 할 수 있습니다. 간단히

    <a href="example.csv" download>download not open it</a>
    
  3. ==============================

    3.검색을 요청한 URL을 어떻게 처리할지 결정하는 것은 브라우저의 몫이므로 신뢰할 수는 없습니다.

    검색을 요청한 URL을 어떻게 처리할지 결정하는 것은 브라우저의 몫이므로 신뢰할 수는 없습니다.

    Content-disposition 헤더를 보내서 즉시 "디스크에 저장"하도록 제안해야한다고 브라우저에 제안 할 수 있습니다.

    header("Content-disposition: attachment");
    

    다양한 브라우저에서 이것이 얼마나 잘 지원되는지 잘 모르겠습니다. 대안은 콘텐츠 유형의 응용 프로그램 / 옥텟 스트림을 보내는 것입니다. 그러나 이것은 해킹입니다 (기본적으로 브라우저에 "이 파일의 종류를 말하지 않고 있습니다."그리고 대부분의 그러면 브라우저에서 다운로드 대화 상자를 제공함) Internet Explorer에 문제가 발생할 수 있습니다.

    이에 대한 자세한 내용은 웹 제작 FAQ를 참조하십시오.

    편집 Content-disposition 헤더를 설정하는 데 필요한 데이터를 전달하기 위해 이미 PHP 파일로 전환했습니다 (이 작업을 수행 할 수있는 다소 분명한 Apache 설정이없는 경우). 이제 PHP 파일에서 CSV 파일의 내용을 읽고 인쇄하는 것만 남아 있습니다. 헤더의 filename = example.csv는 클라이언트 브라우저에 어떤 이름을 사용할지 제안합니다. 실제로는 그렇지 않습니다. 서버의 파일에서 데이터를 가져옵니다.

  4. ==============================

    4.다음은 브라우저 안전 솔루션입니다.

    다음은 브라우저 안전 솔루션입니다.

        $fp = @fopen($yourfile, 'rb');
    
        if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
    {
        header('Content-Type: "application/octet-stream"');
        header('Content-Disposition: attachment; filename="yourname.file"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header("Content-Transfer-Encoding: binary");
        header('Pragma: public');
        header("Content-Length: ".filesize($yourfile));
    }
    else
    {
        header('Content-Type: "application/octet-stream"');
        header('Content-Disposition: attachment; filename="yourname.file"');
        header("Content-Transfer-Encoding: binary");
        header('Expires: 0');
        header('Pragma: no-cache');
        header("Content-Length: ".filesize($yourfile));
    }
    
    fpassthru($fp);
    fclose($fp);
    
  5. ==============================

    5.application / octet-stream 미디어 유형으로 파일을 보내도록 서버를 구성합니다.

    application / octet-stream 미디어 유형으로 파일을 보내도록 서버를 구성합니다.

  6. ==============================

    6.즉, 브라우저가이 파일 유형을 처리 할 수 ​​있습니다.

    즉, 브라우저가이 파일 유형을 처리 할 수 ​​있습니다.

    마음에 들지 않으면 가장 쉬운 방법은 ZIP 파일을 제공하는 것입니다. 누구나 ZIP 파일을 처리 할 수 ​​있으며 기본적으로 다운로드 할 수 있습니다.

  7. ==============================

    7.좋은 깨끗한 솔루션 :

    좋은 깨끗한 솔루션 :

    <?php
        header('Content-Type: application/download');
        header('Content-Disposition: attachment; filename="example.csv"');
        header("Content-Length: " . filesize("example.csv"));
    
        $fp = fopen("example.csv", "r");
        fpassthru($fp);
        fclose($fp);
    ?>
    
  8. ==============================

    8.이 페이지의 이전 대답은 .htaccess를 사용하여 특정 유형의 모든 파일을 강제로 다운로드하는 방법을 설명합니다. 그러나이 솔루션은 모든 브라우저에서 모든 파일 형식에서 작동하지 않습니다. 이것은보다 믿을만한 방법입니다.

    이 페이지의 이전 대답은 .htaccess를 사용하여 특정 유형의 모든 파일을 강제로 다운로드하는 방법을 설명합니다. 그러나이 솔루션은 모든 브라우저에서 모든 파일 형식에서 작동하지 않습니다. 이것은보다 믿을만한 방법입니다.

    <FilesMatch "\.(?i:csv)$">
      ForceType application/octet-stream
      Header set Content-Disposition attachment
    </FilesMatch>
    

    올바르게 작동하는지 확인하려면 브라우저 캐시를 플러시해야 할 수도 있습니다.

  9. ==============================

    9.애플리케이션 자체로이 작업을 수행한다면 ...이 코드가 도움이되기를 바랍니다.

    애플리케이션 자체로이 작업을 수행한다면 ...이 코드가 도움이되기를 바랍니다.

    href에서 - 당신은 URL과 함께 download_file.php를 추가해야합니다 :

    <a class="download" href="'/download_file.php?fileSource='+http://www.google.com/logo_small.png" target="_blank" title="YourTitle">
    
    /* Here is the Download.php file to force download stuff */
    
    <?php
        $fullPath = $_GET['fileSource'];
        if($fullPath) {
            $fsize = filesize($fullPath);
            $path_parts = pathinfo($fullPath);
            $ext = strtolower($path_parts["extension"]);
    
            switch ($ext) {
                case "pdf":
                    header("Content-Disposition: attachment; filename=\"" . $path_parts["basename"]."\""); // Use 'attachment' to force a download
                    header("Content-type: application/pdf"); // Add here more headers for diff. extensions
                    break;
    
                default;
                    header("Content-type: application/octet-stream");
                    header("Content-Disposition: filename=\"" . $path_parts["basename"]."\"");
            }
    
            if($fsize) { // Checking if file size exist
                header("Content-length: $fsize");
            }
            readfile($fullPath);
            exit;
        }
    ?>
    
  10. ==============================

    10.강제로 다운로드하려면 Content-Type : application / force-download 헤더를 사용할 수 있습니다.이 헤더는 대부분의 브라우저에서 지원됩니다.

    강제로 다운로드하려면 Content-Type : application / force-download 헤더를 사용할 수 있습니다.이 헤더는 대부분의 브라우저에서 지원됩니다.

    function downloadFile($filePath)
    {
        header('Content-Type: application/force-download');
        header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
        header('Content-Length: ' . filesize($filePath));
        readfile($filePath);
    }
    

    더 좋은 방법

    이런 방식으로 파일을 다운로드하는 것이 특히 큰 파일의 경우에는 최선의 방법이 아닙니다. PHP는 파일 내용을 읽고 출력하기 위해 여분의 CPU / 메모리가 필요하며 큰 파일을 다룰 때 시간 / 메모리 제한에 도달 할 수 있습니다.

    더 좋은 방법은 PHP를 사용하여 파일에 대한 액세스 권한을 부여하고 액세스 권한을 부여하는 것입니다. 실제 파일 제공은 X-SENDFILE 메서드를 사용하여 웹 서버에 위임해야합니다 (일부 웹 서버 구성 필요).

    X-SENDFILE을 처리하도록 웹 서버를 구성한 후에는 readfile ($ filePath)을 header ( 'X-SENDFILE :'. $ filePath)로 바꾸면 웹 서버가 PHP readfile을 사용하는 것보다 적은 자원을 필요로하는 파일 서비스를 처리합니다.

    (Nginx X-SENDFILE 대신 X-Accel-Redirect 헤더 사용)

    참고 : 빈 파일 다운로드가 끝나면 X-SENDFILE 헤더를 처리하도록 웹 서버를 구성하지 않았 음을 의미합니다. 위의 링크를 확인하여 웹 서버를 올바르게 구성하는 방법을 확인하십시오.

  11. from https://stackoverflow.com/questions/1465573/forcing-to-download-a-file-using-php by cc-by-sa and MIT license