>백엔드 개발 >PHP 문제 >PHP에서 파일을 다운로드하는 방법 [요약]

PHP에서 파일을 다운로드하는 방법 [요약]

藏色散人
藏色散人원래의
2020-08-18 10:49:038830검색

PHP에서 파일을 다운로드하는 방법: 1. "$_GET['file']"에서 파일 경로를 가져옵니다. 2. 헤더 정보를 설정합니다. 3. "file_get_contents()" 및 "file()" 메서드를 사용합니다. 4. "readfile" 및 "fopen" 방법을 통해.

PHP에서 파일을 다운로드하는 방법 [요약]

추천: "PHP 비디오 튜토리얼"

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

1. 파일 경로를 가져옵니다

$_GET['file']

$path_parts = pathinfo($_GET['file']);
$file_name  = $path_parts['basename'];
$file_path  = '/mysecretpath/' . $file_name;

에서 파일 경로를 가져옵니다. 위의 방법을 꼭 사용하세요. 이 방법을 사용하면 경로를 얻을 수 있습니다. 단순히 문자열을 연결하여 경로를 얻을 수는 없습니다

$mypath = '/mysecretpath/' . $_GET['file'];

입력이 ../../이면 모든 경로에 액세스할 수 있습니다

2.

header('Content-Description: File Transfer'); //描述页面返回的结果
header('Content-Type: application/octet-stream'); //返回内容的类型,此处只知道是二进制流。具体返回类型可参考http://tool.oschina.net/commons
header('Content-Disposition: attachment; filename='.basename($file));//可以让浏览器弹出下载窗口
header('Content-Transfer-Encoding: binary');//内容编码方式,直接二进制,不要gzip压缩
header('Expires: 0');//过期时间
header('Cache-Control: must-revalidate');//缓存策略,强制页面不缓存,作用与no-cache相同,但更严格,强制意味更明显
header('Pragma: public');
header('Content-Length: ' . filesize($file));//文件大小,在文件超过2G的时候,filesize()返回的结果可能不正确

3. 파일 출력 file_get_contents( ) 메소드

file_get_contents()는 파일 내용을 문자열로 읽어 들입니다. 즉, 파일을 메모리로 읽어온 다음 내용을 출력합니다

$str = file_get_contents($file);
echo $str;

이런 식으로 파일이 약간 크면 메모리 제한을 초과하게 됩니다

4. 파일을 출력하는 file() 메서드

는 file_get_contents()와 유사하지만, file()은 내용을 한 줄씩 배열로 읽어들이고, 메모리도 차지해야 합니다

$f = file($file);
while(list($line, $cnt) = each($f)) {
   echo $cnt;
}

파일이 크면 메모리 제한을 초과하게 됩니다

5. 출력 파일의 Readfile() 메서드

readfile() 메서드: 파일을 읽고 출력 버퍼에 씁니다

이 방법은 전체 파일이 메모리를 차지하지 않고 바로 버퍼에 출력할 수 있는 방법입니다

전제 조건은 먼저 버퍼링을 지우고 파일을 다운로드할 수 있는 대화 상자를 사용자에게 표시하는 것입니다

while (ob_get_level()) ob_end_clean();
//设置完header以后
ob_clean();
flush();  //清空缓冲区
readfile($file);

이 방법은 대용량 파일을 출력하고 읽을 수 있습니다 다음 상황을 제외하고 단일 파일은 메모리 제한을 초과하지 않습니다.

readfile()은 여러 사람이 파일을 읽을 때 PHP 메모리가 소진되게 합니다. http://stackoverflow.com/questions/6627952/why-does-readfile-exhaust-php-memory

PHP는 읽어야 합니다 따라서 300Mb 파일의 경우 어떤 구현을 작성하든(많은 작은 세그먼트 또는 1개의 큰 청크) PHP는 결국 300Mb의 파일을 읽어야 합니다.

여러 사용자의 경우 (한 서버에서는 호스팅 제공업체가 각 호스팅 사용자에게 제공되는 메모리를 제한합니다. 이러한 제한된 메모리로 인해 버퍼를 사용하는 것은 좋은 생각이 아닐 것 같습니다. )

제 생각에는 파일을 다운로드하기 위한 직접 링크는 대용량 파일에 훨씬 더 나은 접근 방식입니다.

주요 아이디어: PHP는 파일을 읽은 다음 버퍼에 출력해야 합니다. 300M 파일의 경우 PHP는 여전히 300M의 메모리를 읽어야 합니다. 따라서 여러 사용자가 동시에 다운로드하는 경우 버퍼에도 메모리가 부족해집니다. (틀리면 정정해주세요)

예를 들어 100명의 사용자가 다운로드하는 경우 100*buffer_size 메모리가 필요합니다

6 출력 파일의 fopen() 메서드

set_time_limit(0);
$file = @fopen($file_path,"rb");
while(!feof($file))
{
    print(@fread($file, 1024*8));
    ob_flush();
    flush();
}

fopen()은 대용량 파일을 읽을 수 있으며 콘텐츠의 일부를 읽을 때마다 지정됩니다. 대용량 파일을 운영할 때도 유용합니다

7. 요약

PHP를 사용하여 파일을 다운로드할 때는 시나리오에 주의해야 합니다. 소수의 작은 파일만 다운로드하는 경우에는 PHP를 사용하여 다운로드하는 것이 더 좋지만, PHP가 많은 수의 다운로드 요청을 견뎌야 하는 경우에는 PHP에서 파일 다운로드를 수행하면 안 됩니다.

Apache의 경우 더 간단하고 빠른 다운로드 작업을 완료하는 데 도움이 되는 mod_xsendfile이 있습니다

위 내용은 PHP에서 파일을 다운로드하는 방법 [요약]의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.