php讓圖片可以下載的代碼
<?php
// 安全性過(guò)濾
$fileName = basename($_SERVER['QUERY_STRING']);
$filePath = dirname(__FILE__) . ‘/' . DL_DIR . $fileName;
/*
簡(jiǎn)述: DIRECTORY_SEPARATOR(目錄界定符, 目錄函數(shù)庫(kù)預(yù)定義常量)
來(lái)源: Directory 目錄函數(shù)(PHP手冊(cè)->函數(shù)參考->Directories節(jié)點(diǎn))
說(shuō)明: windows系統(tǒng)下為反斜杠'\', Linux系統(tǒng)下為'/',
windows下兩個(gè)都正常用, linux就不知道了, 為了標(biāo)準(zhǔn), 顯得專(zhuān)業(yè)點(diǎn), 嘿嘿.
*/
$filePath = str_replace(array(‘/', ‘\\'), DIRECTORY_SEPARATOR, $filePath);
if(!is_file($filePath)) {
exit(‘File: ' . $fileName . ‘ not exists!');
} else { // 如果是一個(gè)有效的文件
// 文件擴(kuò)展名
$fileExt = substr(strrchr($fileName, ‘.'), 1);
// 文件類(lèi)型
$fileType = $MIMETypes[$fileExt] ? $MIMETypes[$fileExt] : ‘a(chǎn)pplication/octet-stream';
// 是否是圖片
$isImage = False;
/*
簡(jiǎn)述: getimagesize(), 詳見(jiàn)手冊(cè)
說(shuō)明: 判定某個(gè)文件是否為圖片的有效手段, 常用在文件上傳驗(yàn)證
*/
$imgInfo = @getimagesize($filePath);
if ($imgInfo[2] && $imgInfo['bits']) {
$isImage = True;
}
// 顯示方式
$attachment = $isImage ? ‘inline' : ‘a(chǎn)ttachment';
// 讀取文件
if (is_readable($filePath)) {
/*
簡(jiǎn)述: ob_end_clean() 清空并關(guān)閉輸出緩沖, 詳見(jiàn)手冊(cè)
說(shuō)明: 關(guān)閉輸出緩沖, 使文件片段內(nèi)容讀取至內(nèi)存后即被送出, 減少資源消耗
*/
ob_end_clean();
/*
HTTP頭信息: 指示客戶機(jī)可以接收生存期不大于指定時(shí)間(秒)的響應(yīng)
*/
header(‘Cache-control: max-age=31536000′);
/*
HTTP頭信息: 緩存文件過(guò)期時(shí)間(格林威治標(biāo)準(zhǔn)時(shí))
*/
header(‘Expires: ' . gmdate(‘D, d M Y H:i:s', time()+31536000) . ‘ GMT');
/*
HTTP頭信息: 文件在服務(wù)期端最后被修改的時(shí)間
Cache-control,Expires,Last-Modified 都是控制瀏覽器緩存的頭信息
在一些訪問(wèn)量巨大的門(mén)戶, 合理的設(shè)置緩存能夠避免過(guò)多的服務(wù)器請(qǐng)求, 一定程度下緩解服務(wù)器的壓力
*/
header(‘Last-Modified: ' . gmdate(‘D, d M Y H:i:s' , filemtime($filePath) . ‘ GMT'));
/*
HTTP頭信息: 文檔的編碼(Encode)方法, 因?yàn)楦郊?qǐng)求的文件多樣化, 改變編碼方式有可能損壞文件, 故為none
*/
header(‘Content-Encoding: none');
/*
HTTP頭信息: 告訴瀏覽器當(dāng)前請(qǐng)求的文件類(lèi)型.
1.始終指定為application/octet-stream, 就代表文件是二進(jìn)制流, 始終提示下載.
2.指定對(duì)應(yīng)的類(lèi)型, 如請(qǐng)求的是mp3文件, 對(duì)應(yīng)的MIME類(lèi)型是audio/mpeg, IE就會(huì)自動(dòng)啟動(dòng)Windows Media Player進(jìn)行播放.
*/
header(‘Content-type: ' . $fileType);
/*
HTTP頭信息: 如果為attachment, 則告訴瀏覽器, 在訪問(wèn)時(shí)彈出”文件下載”對(duì)話框, 并指定保存時(shí)文件的默認(rèn)名稱(可以與服務(wù)器的文件名不同)
如果要讓瀏覽器直接顯示內(nèi)容, 則要指定為inline, 如圖片, 文本
*/
header(‘Content-Disposition: ' . $attachment . ‘; filename=' . $fileName);
/*
HTTP頭信息: 告訴瀏覽器文件長(zhǎng)度
(IE下載文件的時(shí)候不是有文件大小信息么?)
*/
header(‘Content-Length: ' . filesize($filePath));
// 打開(kāi)文件(二進(jìn)制只讀模式)
$fp = fopen($filePath, ‘rb');
// 輸出文件
fpassthru($fp);
// 關(guān)閉文件
fclose($fp);
exit();
} else {
exit(‘Read file failed!');
}
}
?>
- 使用ThinkPHP自帶的Http類(lèi)下載遠(yuǎn)程圖片到本地的實(shí)現(xiàn)代碼
- PHP多線程批量采集下載美女圖片的實(shí)現(xiàn)代碼(續(xù))
- php實(shí)現(xiàn)改變圖片直接打開(kāi)為下載的方法
- 抓取并下載CSS中所有圖片文件的php代碼
- PHP批量采集下載美女圖片的實(shí)現(xiàn)代碼
- PHP通過(guò)正則表達(dá)式下載圖片到本地的實(shí)現(xiàn)代碼
- PHP使用pcntl_fork實(shí)現(xiàn)多進(jìn)程下載圖片的方法
- php中通過(guò)正則表達(dá)式下載內(nèi)容中的遠(yuǎn)程圖片的函數(shù)代碼
- php中使用gd庫(kù)實(shí)現(xiàn)下載網(wǎng)頁(yè)中所有圖片
- PHP實(shí)現(xiàn)圖片批量打包下載功能
相關(guān)文章
PHP中的array數(shù)組類(lèi)型分析說(shuō)明
PHP的array就是一個(gè)有序的map。map是一個(gè)key和value關(guān)聯(lián)的類(lèi)型。2010-07-07php 刪除一個(gè)數(shù)組中的某個(gè)值.兼容多維數(shù)組!
php中刪除一個(gè)數(shù)組中的某個(gè)值.兼容多維數(shù)組,需要的朋友可以參考下2012-02-02php實(shí)現(xiàn)的redis緩存類(lèi)定義與使用方法示例
這篇文章主要介紹了php實(shí)現(xiàn)的redis緩存類(lèi),結(jié)合具體實(shí)例形式分析了php封裝的針對(duì)redis緩存類(lèi)定義與使用相關(guān)操作技巧,需要的朋友可以參考下2017-08-08PHP實(shí)現(xiàn)超簡(jiǎn)單的SSL加密解密、驗(yàn)證及簽名的方法示例
這篇文章主要介紹了PHP實(shí)現(xiàn)超簡(jiǎn)單的SSL加密解密、驗(yàn)證及簽名的方法,結(jié)合實(shí)例形式分析了php基于openssl相關(guān)函數(shù)的簽名、加密、解密、驗(yàn)證等操作技巧,需要的朋友可以參考下2017-08-08PHP反射類(lèi)ReflectionClass和ReflectionObject的使用方法
PHP反射類(lèi)ReflectionClass和ReflectionObject2013-11-11PHP實(shí)現(xiàn)微信掃碼登錄功能的兩種方式總結(jié)
這篇文章主要為大家介紹了利用PHP實(shí)現(xiàn)微信掃碼登錄功能的兩種方式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定借鑒價(jià)值,需要的可以參考一下2022-08-08PHP fopen 讀取帶中文URL地址的一點(diǎn)見(jiàn)解
之前喜歡用fopen()函數(shù)跨域讀取圖片或其它文件,一直都沒(méi)發(fā)現(xiàn)什么問(wèn)題。我所用的PHP版本都是5的了,應(yīng)該不會(huì)有CRLF Injection攻擊危險(xiǎn)吧2012-09-09無(wú)需重新編譯php加入ftp擴(kuò)展的解決方法
本文為大家介紹無(wú)需重新編譯php加入ftp擴(kuò)展的方法,有需要的朋友可以參考下2013-02-02