복붙노트

PHP로 파일을 강제로 다운로드하는 방법

카테고리 없음

PHP로 파일을 강제로 다운로드하는 방법

PHP로 웹 페이지를 방문한 사용자가 파일을 다운로드하도록 요구하고 싶습니다. 나는 그것이 file_get_contents와 관련이 있다고 생각하지만 그것을 실행하는 방법을 모르겠다.

$url = "http://example.com/go.exe";

헤더 (위치)가있는 파일을 다운로드 한 후 다른 페이지로 리디렉션하지 않습니다. 그냥 멈 춥니 다.

해결법

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

    1.

    내장 PHP 함수 readfile에 관한 문서 읽기

    $file_url = 'http://www.myremoteserver.com/file.exe';
    header('Content-Type: application/octet-stream');
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-disposition: attachment; filename=\"" . basename($file_url) . "\""); 
    readfile($file_url); // do the double-download-dance (dirty but worky)
    

    또한 파일 응용 프로그램 / zip, 응용 프로그램 / pdf 등을 기반으로 적절한 컨텐트 유형을 추가하십시오. 단, 저장 대화 상자를 트리거하지 않으려는 경우에만 확인하십시오.

  2. ==============================

    2.

    header("Content-Type: application/octet-stream");
    header("Content-Transfer-Encoding: Binary");
    header("Content-disposition: attachment; filename=\"file.exe\""); 
    echo readfile($url);
    

    맞다

    또는 exe 형식의 파일에 대한 더 나은

    header("Location: $url");
    
  3. ==============================

    3.

    <?php
    $file = "http://example.com/go.exe"; 
    
    header("Content-Description: File Transfer"); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename='" . basename($file) . "'"); 
    
    readfile ($file);
    exit(); 
    ?>
    

    또는 브라우저에서 파일을 열 수없는 경우 위치 헤더를 사용할 수 있습니다.

    <?php header("Location: http://example.com/go.exe"); ?>
    
  4. ==============================

    4.

    당신이 허용 된 메모리 한계 (memory_limit ini 설정)보다 큰 크기의 파일을 다운로드해야하는 경우, PHP 치명적인 오류가 발생합니다 : 5242880 바이트의 메모리 크기가 부족하여 오류가 발생했습니다.

    // File to download.
    $file = '/path/to/file';
    
    // Maximum size of chunks (in bytes).
    $maxRead = 1 * 1024 * 1024; // 1MB
    
    // Give a nice name to your download.
    $fileName = 'download_file.txt';
    
    // Open a file in read mode.
    $fh = fopen($file, 'r');
    
    // These headers will force download on browser,
    // and set the custom file name for the download, respectively.
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="' . $fileName . '"');
    
    // Run this until we have read the whole file.
    // feof (eof means "end of file") returns `true` when the handler
    // has reached the end of file.
    while (!feof($fh)) {
        // Read and output the next chunk.
        echo fread($fh, $maxRead);
    
        // Flush the output buffer to free memory.
        ob_flush();
    }
    
    // Exit to make sure not to output anything else.
    exit;
    
  5. ==============================

    5.

    파일을 먼저 표시하고 그 값을 url로 설정하십시오.

    index.php

    <a href="download.php?download='.$row['file'].'" title="Download File">
    

    download.php

    <?php
    /*db connectors*/
    include('dbconfig.php');
    
    /*function to set your files*/
    function output_file($file, $name, $mime_type='')
    {
        if(!is_readable($file)) die('File not found or inaccessible!');
        $size = filesize($file);
        $name = rawurldecode($name);
        $known_mime_types=array(
            "htm" => "text/html",
            "exe" => "application/octet-stream",
            "zip" => "application/zip",
            "doc" => "application/msword",
            "jpg" => "image/jpg",
            "php" => "text/plain",
            "xls" => "application/vnd.ms-excel",
            "ppt" => "application/vnd.ms-powerpoint",
            "gif" => "image/gif",
            "pdf" => "application/pdf",
            "txt" => "text/plain",
            "html"=> "text/html",
            "png" => "image/png",
            "jpeg"=> "image/jpg"
        );
    
        if($mime_type==''){
            $file_extension = strtolower(substr(strrchr($file,"."),1));
            if(array_key_exists($file_extension, $known_mime_types)){
                $mime_type=$known_mime_types[$file_extension];
            } else {
                $mime_type="application/force-download";
            };
        };
        @ob_end_clean();
        if(ini_get('zlib.output_compression'))
        ini_set('zlib.output_compression', 'Off');
        header('Content-Type: ' . $mime_type);
        header('Content-Disposition: attachment; filename="'.$name.'"');
        header("Content-Transfer-Encoding: binary");
        header('Accept-Ranges: bytes');
    
        if(isset($_SERVER['HTTP_RANGE']))
        {
            list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);
            list($range) = explode(",",$range,2);
            list($range, $range_end) = explode("-", $range);
            $range=intval($range);
            if(!$range_end) {
                $range_end=$size-1;
            } else {
                $range_end=intval($range_end);
            }
    
            $new_length = $range_end-$range+1;
            header("HTTP/1.1 206 Partial Content");
            header("Content-Length: $new_length");
            header("Content-Range: bytes $range-$range_end/$size");
        } else {
            $new_length=$size;
            header("Content-Length: ".$size);
        }
    
        $chunksize = 1*(1024*1024);
        $bytes_send = 0;
        if ($file = fopen($file, 'r'))
        {
            if(isset($_SERVER['HTTP_RANGE']))
            fseek($file, $range);
    
            while(!feof($file) &&
                (!connection_aborted()) &&
                ($bytes_send<$new_length)
            )
            {
                $buffer = fread($file, $chunksize);
                echo($buffer);
                flush();
                $bytes_send += strlen($buffer);
            }
            fclose($file);
        } else
            die('Error - can not open file.');
        die();
    }
    set_time_limit(0);
    
    /*set your folder*/
    $file_path='uploads/'."your file";
    
    /*output must be folder/yourfile*/
    
    output_file($file_path, ''."your file".'', $row['type']);
    
    /*back to index.php while downloading*/
    header('Location:index.php');
    ?>
    
  6. ==============================

    6.

    위의 허용 된 답변을 수정하여 런타임의 MIME 유형도 감지합니다.

    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    header('Content-Type: '.finfo_file($finfo, $path));
    
    $finfo = finfo_open(FILEINFO_MIME_ENCODING);
    header('Content-Transfer-Encoding: '.finfo_file($finfo, $path)); 
    
    header('Content-disposition: attachment; filename="'.basename($path).'"'); 
    readfile($path); // do the double-download-dance (dirty but worky)
    
  7. ==============================

    7.

    다음 코드는 다음 튜토리얼에서 설명한대로 PHP에서 다운로드 서비스를 구현하는 올바른 방법입니다

    header('Content-Type: application/zip');
    header("Content-Disposition: attachment; filename=\"$file_name\"");
    set_time_limit(0);
    $file = @fopen($filePath, "rb");
    while(!feof($file)) {
        print(@fread($file, 1024*8));
        ob_flush();
        flush();
    }
    
  8. ==============================

    8.

    이 시도:

    header('Content-type: audio/mp3'); 
    header('Content-disposition: attachment; 
    filename=“'.$trackname'”');                             
    readfile('folder name /'.$trackname);          
    exit();
    
  9. ==============================

    9.

    http://php.net/manual/en/function.readfile.php

    그게 당신이 필요한 전부입니다. "Monkey.gif"가 파일 이름으로 변경됩니다. 다른 서버에서 다운로드해야하는 경우 "monkey.gif"가 "http://www.exsample.com/go.exe"로 변경됩니다.

  10. from https://stackoverflow.com/questions/7263923/how-to-force-file-download-with-php by cc-by-sa and MIT lisence