PHP를 사용하여 파일을 다운로드하도록 강제 실행
PHPPHP를 사용하여 파일을 다운로드하도록 강제 실행
내 서버에 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.서버에있는 모든 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.또는 HTML5를 사용하여이 작업을 수행 할 수 있습니다. 간단히
또는 HTML5를 사용하여이 작업을 수행 할 수 있습니다. 간단히
<a href="example.csv" download>download not open it</a>
-
==============================
3.검색을 요청한 URL을 어떻게 처리할지 결정하는 것은 브라우저의 몫이므로 신뢰할 수는 없습니다.
검색을 요청한 URL을 어떻게 처리할지 결정하는 것은 브라우저의 몫이므로 신뢰할 수는 없습니다.
Content-disposition 헤더를 보내서 즉시 "디스크에 저장"하도록 제안해야한다고 브라우저에 제안 할 수 있습니다.
header("Content-disposition: attachment");
다양한 브라우저에서 이것이 얼마나 잘 지원되는지 잘 모르겠습니다. 대안은 콘텐츠 유형의 응용 프로그램 / 옥텟 스트림을 보내는 것입니다. 그러나 이것은 해킹입니다 (기본적으로 브라우저에 "이 파일의 종류를 말하지 않고 있습니다."그리고 대부분의 그러면 브라우저에서 다운로드 대화 상자를 제공함) Internet Explorer에 문제가 발생할 수 있습니다.
이에 대한 자세한 내용은 웹 제작 FAQ를 참조하십시오.
편집 Content-disposition 헤더를 설정하는 데 필요한 데이터를 전달하기 위해 이미 PHP 파일로 전환했습니다 (이 작업을 수행 할 수있는 다소 분명한 Apache 설정이없는 경우). 이제 PHP 파일에서 CSV 파일의 내용을 읽고 인쇄하는 것만 남아 있습니다. 헤더의 filename = example.csv는 클라이언트 브라우저에 어떤 이름을 사용할지 제안합니다. 실제로는 그렇지 않습니다. 서버의 파일에서 데이터를 가져옵니다.
-
==============================
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.application / octet-stream 미디어 유형으로 파일을 보내도록 서버를 구성합니다.
application / octet-stream 미디어 유형으로 파일을 보내도록 서버를 구성합니다.
-
==============================
6.즉, 브라우저가이 파일 유형을 처리 할 수 있습니다.
즉, 브라우저가이 파일 유형을 처리 할 수 있습니다.
마음에 들지 않으면 가장 쉬운 방법은 ZIP 파일을 제공하는 것입니다. 누구나 ZIP 파일을 처리 할 수 있으며 기본적으로 다운로드 할 수 있습니다.
-
==============================
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.이 페이지의 이전 대답은 .htaccess를 사용하여 특정 유형의 모든 파일을 강제로 다운로드하는 방법을 설명합니다. 그러나이 솔루션은 모든 브라우저에서 모든 파일 형식에서 작동하지 않습니다. 이것은보다 믿을만한 방법입니다.
이 페이지의 이전 대답은 .htaccess를 사용하여 특정 유형의 모든 파일을 강제로 다운로드하는 방법을 설명합니다. 그러나이 솔루션은 모든 브라우저에서 모든 파일 형식에서 작동하지 않습니다. 이것은보다 믿을만한 방법입니다.
<FilesMatch "\.(?i:csv)$"> ForceType application/octet-stream Header set Content-Disposition attachment </FilesMatch>
올바르게 작동하는지 확인하려면 브라우저 캐시를 플러시해야 할 수도 있습니다.
-
==============================
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.강제로 다운로드하려면 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 헤더를 처리하도록 웹 서버를 구성하지 않았 음을 의미합니다. 위의 링크를 확인하여 웹 서버를 올바르게 구성하는 방법을 확인하십시오.
from https://stackoverflow.com/questions/1465573/forcing-to-download-a-file-using-php by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
PHP가 포함 된 GCM (Google 클라우드 메시징) (0) | 2018.09.06 |
---|---|
PHP와 MySQL : mysqli_num_rows ()는 매개 변수 1이 mysqli_result, boolean이 주어진 것으로 기대한다. [duplicate] (0) | 2018.09.06 |
PHP 용 obfuscator 코드가 있습니까? [닫은] (0) | 2018.09.06 |
인코딩을 감지하고 모든 것을 UTF-8로 만듭니다. (0) | 2018.09.06 |
SimpleXML : 특정 속성 값을 갖는 요소 선택하기 (0) | 2018.09.06 |