찾다
백엔드 개발PHP 튜토리얼php下载文件 强制任意文件格式下载_PHP教程

用php下载一些文件,一般就是为了隐藏文件的真实下载地址才需要这样,否则这样会增加服务器负担,不如直接提供软件的地址。

一个简单的php文件下载源代码,虽不支持断点续传等,但是可以满足一些常用的需求了。php下载文件其实用一个a标签就能实现,比如 magento-1.8.1.0.zip 。但是遇到一些浏览器能识别的格式,比如.txt,.html,.pdf等,再用abc.txt 想必也知道会发生什么了。

<?<span>php 
</span><span>/*</span><span>*
* 文件下载
*
*</span><span>*/</span>
<span>header</span>("Content-type:text/html;charset=utf-8"<span>);
download(</span>'web/magento-1.8.1.0.zip', 'magento下载'<span>); 
</span><span>function</span> download(<span>$file</span>, <span>$down_name</span><span>){
</span><span>$suffix</span> = <span>substr</span>(<span>$file</span>,<span>strrpos</span>(<span>$file</span>,'.')); <span>//</span><span>获取文件后缀</span>
<span>$down_name</span> = <span>$down_name</span>.<span>$suffix</span>; <span>//</span><span>新文件名,就是下载后的名字
//判断给定的文件存在与否 </span>
<span>if</span>(!<span>file_exists</span>(<span>$file</span><span>)){
</span><span>die</span>("您要下载的文件已不存在,可能是被删除"<span>);
} 
</span><span>$fp</span> = <span>fopen</span>(<span>$file</span>,"r"<span>);
</span><span>$file_size</span> = <span>filesize</span>(<span>$file</span><span>);
</span><span>//</span><span>下载文件需要用到的头</span>
<span>header</span>("Content-type: application/octet-stream"<span>);
</span><span>header</span>("Accept-Ranges: bytes"<span>);
</span><span>header</span>("Accept-Length:".<span>$file_size</span><span>);
</span><span>header</span>("Content-Disposition: attachment; filename=".<span>$down_name</span><span>);
</span><span>$buffer</span> = 1024<span>;
</span><span>$file_count</span> = 0<span>;
</span><span>//</span><span>向浏览器返回数据 </span>
<span>while</span>(!<span>feof</span>(<span>$fp</span>) && <span>$file_count</span> < <span>$file_size</span><span>){
</span><span>$file_con</span> = <span>fread</span>(<span>$fp</span>,<span>$buffer</span><span>);
</span><span>$file_count</span> += <span>$buffer</span><span>;
</span><span>echo</span> <span>$file_con</span><span>;
} www.jbxue.com
</span><span>fclose</span>(<span>$fp</span><span>);
}
</span>?>

PHP强制性文件下载的源代码

为用户提供强制性的文件下载功能。

<span>/*</span><span>*******************
*@file - path to file
</span><span>*/</span>
<span>function</span> force_download(<span>$file</span><span>)
{
</span><span>if</span> ((<span>isset</span>(<span>$file</span>))&&(<span>file_exists</span>(<span>$file</span><span>))) {
</span><span>header</span>("Content-length: ".<span>filesize</span>(<span>$file</span><span>));
</span><span>header</span>('Content-Type: application/octet-stream'<span>);
</span><span>header</span>('Content-Disposition: attachment; filename="' . <span>$file</span> . '"'<span>);
</span><span>readfile</span>("<span>$file</span>"<span>);
} </span><span>else</span><span> {
</span><span>echo</span> "No file selected"<span>;
}
}</span>

你一定会笑我"下载文件"如此简单都值得说?当然并不是想象那么简单。例如你希望客户要填完一份表格,才可以下载某一文件,你第一个想法一定是用 "Redirect"的方法,先检查表格是否已经填写完毕和完整,然后就将网址指到该文件,这样客户才能下载,但如果你想做一个关于"网上购物"的电子商务网站,考虑安全问题,你不想用户直接复制网址下载该文件,笔者建议你使用PHP直接读取该实际文件然后下载的方法去做。程序如下:

<span>$file_name</span> = "info_check.exe"<span>;
</span><span>$file_dir</span> = "/public/www/download/"<span>;
</span><span>if</span> (!<span>file_exists</span>(<span>$file_dir</span> . <span>$file_name</span>)) { <span>//</span><span>检查文件是否存在</span>
<span>echo</span> "文件找不到"<span>;
</span><span>exit</span><span>;
} </span><span>else</span><span> {
</span><span>$file</span> = <span>fopen</span>(<span>$file_dir</span> . <span>$file_name</span>,"r"); <span>//</span><span> 打开文件
// 输入文件标签 www.jbxue.com</span>
<span>Header</span>("Content-type: application/octet-stream"<span>);
</span><span>Header</span>("Accept-Ranges: bytes"<span>);
</span><span>Header</span>("Accept-Length: ".<span>filesize</span>(<span>$file_dir</span> . <span>$file_name</span><span>));
</span><span>Header</span>("Content-Disposition: attachment; filename=" . <span>$file_name</span><span>);
</span><span>//</span><span> 输出文件内容</span>
<span>echo</span> <span>fread</span>(<span>$file</span>,<span>filesize</span>(<span>$file_dir</span> . <span>$file_name</span><span>));
</span><span>fclose</span>(<span>$file</span><span>);
</span><span>exit</span><span>;
} </span>

而如果文件路径是"http" 或者 "ftp" 网址的话,则源代码会有少许改变,程序如下:

<span>$file_name</span> = "info_check.exe"<span>;
</span><span>$file_dir</span> = "http://www.jbxue.com/"<span>;
</span><span>$file</span> = @ <span>fopen</span>(<span>$file_dir</span> . <span>$file_name</span>,"r"<span>);
</span><span>if</span> (!<span>$file</span><span>) {
</span><span>echo</span> "文件找不到"<span>;
} </span><span>else</span><span> {
</span><span>Header</span>("Content-type: application/octet-stream"<span>);
</span><span>Header</span>("Content-Disposition: attachment; filename=" . <span>$file_name</span><span>);
</span><span>while</span> (!<span>feof</span> (<span>$file</span><span>)) {
</span><span>echo</span> <span>fread</span>(<span>$file</span>,50000<span>);
}
</span><span>fclose</span> (<span>$file</span><span>);
} </span>

这样就可以用PHP直接输出文件了。

但,一定要注意:Header信息相当于先将文件信息高速浏览器,然后,再把浏览器上的信息下载到附件中。所以,如果在MVC模式的应用程序中,view页一定不要有任何内容,否则,view页的相关内容会随着文件的内容一同被下载,导致下载后的文件不能使用。
下面是我的程序:

 

<span>public</span> <span>function</span><span> downloadAction()
{
</span><span>if</span> (<span>isset</span>(<span>$_GET</span>['mriID'<span>]))
{
</span><span>$this</span>->view->mriID=(<span>get_magic_quotes_gpc</span>())?<span>$_GET</span>['mriID']:<span>addslashes</span>(<span>$_GET</span>['mriID'<span>]);
}
</span><span>if</span> (<span>isset</span>(<span>$_GET</span>['dicomID'<span>]))
{
</span><span>$this</span>->view->dicomID=(<span>get_magic_quotes_gpc</span>())?<span>$_GET</span>['dicomID']:<span>addslashes</span>(<span>$_GET</span>['dicomID'<span>]);
}
</span><span>if</span> (<span>isset</span>(<span>$_GET</span>['JPGID'<span>]))
{
</span><span>$this</span>->view->JPGID=(<span>get_magic_quotes_gpc</span>())?<span>$_GET</span>['JPGID']:<span>addslashes</span>(<span>$_GET</span>['JPGID'<span>]);
} www.jbxue.com
</span><span>$dicomfile</span>=<span>new</span><span> dicomfile(); 
</span><span>$jpgfile</span>=<span>new</span><span> jpgfile();
</span><span>$mri</span>=<span>new</span><span> mri();
</span><span>if</span>(<span>$this</span>->view-><span>dicomID)
{
</span><span>$filename</span>=<span>$dicomfile</span>->find(<span>$this</span>->view->dicomID)-><span>toArray();
</span><span>$filename</span>=<span>$filename</span>[0]['filename'<span>];
} 
</span><span>else</span> <span>if</span>(<span>$this</span>->view-><span>JPGID)
{
</span><span>$filename</span>=<span>$jpgfile</span>->find(<span>$this</span>->view->JPGID)-><span>toArray();
</span><span>$filename</span>=<span>$filename</span>[0]['JPGname'<span>];
}
</span><span>$dir</span>=<span>$mri</span>->find(<span>$this</span>->view->mriID)-><span>toArray();
</span><span>$dir</span>=<span>$dir</span>[0]['dicom_path'<span>];
</span><span>$file</span>=<span>$dir</span>.'/'.<span>$filename</span><span>;
</span><span>if</span> (!<span>file_exists</span>(<span>$file</span><span>))
{
</span><span>echo</span> "the file does not exist!"<span>;
</span><span>exit</span><span>();
}
</span><span>$file_size</span>=<span>filesize</span>(<span>$file</span><span>);
</span><span>header</span>("Content-type: application/octet-stream"<span>);
</span><span>header</span>("Accept-Ranges: bytes"<span>);
</span><span>header</span>("Accept-Length:". <span>$file_size</span><span>);
</span><span>header</span>("Content-Disposition: attachment; filename=".<span>$filename</span><span>); 
</span><span>$fp</span>=<span>fopen</span>(<span>$file</span>,"r"<span>);
</span><span>if</span> (!<span>$fp</span><span>)
</span><span>echo</span> "can't open file!"<span>;
</span><span>$buffer_size</span>=1024<span>;
</span><span>$cur_pos</span>=0<span>;
</span><span>while</span> (!<span>feof</span>(<span>$fp</span>)&&<span>$file_size</span>-<span>$cur_pos</span>><span>$buffer_size</span><span>)
{
</span><span>$buffer</span>=<span>fread</span>(<span>$fp</span>,<span>$buffer_size</span><span>);
</span><span>echo</span> <span>$buffer</span><span>;
</span><span>$cur_pos</span>+=<span>$buffer_size</span><span>;
}
</span><span>$buffer</span>=<span>fread</span>(<span>$fp</span>,<span>$file_size</span>-<span>$cur_pos</span><span>);
</span><span>echo</span> <span>$buffer</span><span>;
</span><span>fclose</span>(<span>$fp</span><span>); 
}</span>

此时,download.phtml页面一定要是完全空白的。千万不要有任何内容(包括如下的固定信息:

<!DOCTYPE html <span>PUBLIC</span> "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>)否则,这些信息都将被下载到下载文件中,导致文件不能使用。

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/767673.htmlTechArticle用php下载一些文件,一般就是为了隐藏文件的真实下载地址才需要这样,否则这样会增加服务器负担,不如直接提供软件的地址。 一个简单...
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
Laravel의 플래시 세션 데이터로 작업합니다Laravel의 플래시 세션 데이터로 작업합니다Mar 12, 2025 pm 05:08 PM

Laravel은 직관적 인 플래시 방법을 사용하여 임시 세션 데이터 처리를 단순화합니다. 응용 프로그램에 간단한 메시지, 경고 또는 알림을 표시하는 데 적합합니다. 데이터는 기본적으로 후속 요청에만 지속됩니다. $ 요청-

PHP 로깅 : PHP 로그 분석을위한 모범 사례PHP 로깅 : PHP 로그 분석을위한 모범 사례Mar 10, 2025 pm 02:32 PM

PHP 로깅은 웹 애플리케이션을 모니터링하고 디버깅하고 중요한 이벤트, 오류 및 런타임 동작을 캡처하는 데 필수적입니다. 시스템 성능에 대한 귀중한 통찰력을 제공하고 문제를 식별하며 더 빠른 문제 해결을 지원합니다.

PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법Mar 14, 2025 am 11:42 AM

PHP 클라이언트 URL (CURL) 확장자는 개발자를위한 강력한 도구이며 원격 서버 및 REST API와의 원활한 상호 작용을 가능하게합니다. PHP CURL은 존경받는 다중 프로모토콜 파일 전송 라이브러리 인 Libcurl을 활용하여 효율적인 execu를 용이하게합니다.

Laravel 테스트에서 단순화 된 HTTP 응답 조롱Laravel 테스트에서 단순화 된 HTTP 응답 조롱Mar 12, 2025 pm 05:09 PM

Laravel은 간결한 HTTP 응답 시뮬레이션 구문을 제공하여 HTTP 상호 작용 테스트를 단순화합니다. 이 접근법은 테스트 시뮬레이션을보다 직관적으로 만들면서 코드 중복성을 크게 줄입니다. 기본 구현은 다양한 응답 유형 단축키를 제공합니다. Illuminate \ support \ Facades \ http를 사용하십시오. http :: 가짜 ([ 'google.com'=> ​​'Hello World', 'github.com'=> ​​[ 'foo'=> 'bar'], 'forge.laravel.com'=>

Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트Mar 13, 2025 pm 12:08 PM

고객의 가장 긴급한 문제에 실시간 인스턴트 솔루션을 제공하고 싶습니까? 라이브 채팅을 통해 고객과 실시간 대화를 나누고 문제를 즉시 해결할 수 있습니다. 그것은 당신이 당신의 관습에 더 빠른 서비스를 제공 할 수 있도록합니다.

PHP에서 늦은 정적 결합의 개념을 설명하십시오.PHP에서 늦은 정적 결합의 개념을 설명하십시오.Mar 21, 2025 pm 01:33 PM

기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능

프레임 워크 사용자 정의/확장 : 사용자 정의 기능을 추가하는 방법.프레임 워크 사용자 정의/확장 : 사용자 정의 기능을 추가하는 방법.Mar 28, 2025 pm 05:12 PM

이 기사에서는 프레임 워크에 사용자 정의 기능 추가, 아키텍처 이해, 확장 지점 식별 및 통합 및 디버깅을위한 모범 사례에 중점을 둡니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.