1. 程式人生 > >php如何下載檔案

php如何下載檔案

Normally when want to let a user download a file, you simply stick it in a dir under the document root and let Apache do the rest.

Let PHP serve the download

However in some cases that is not good enough. You might need to do some authenticate first or you need to lookup the actual file name. In that case you would use PHP, which would result in a script looking like this:

1
2
3
4
5
6
7
8
9
authenticate(); # authenticate and authorize, redirect/exit if failed
$file = determine_file();
 
if (!file_exists($file)) trigger_error("File '$file' doesn't exist.", E_USER_ERROR);
 
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="'
. basename($file) . '"'); header("Content-Length: ". filesize($file)); readfile($file);

This means PHP has to read in the file, which goes through the output buffer, is flushed to Apache and processed before send to client. If I want to make the caching based on last-modified work, you need to check the if-modified-since request header, check the mtime of the file and send a 304 result header.

X-SendFile to the rescue

Wouldn’t it be nicer to tell Apache, please send that file, and be done with it. Well, you can. When you enable Apache module ‘mod_xsendfile’ in Apache, you can send an X-SendFile header, which is processed by Apache.

1
2
3
4
5
6
authenticate(); # authenticate and authorize, redirect/exit if failed
$file = determine_file();
 
header("X-Sendfile: $file");
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . basename($file) . '"');

Note that this technique was copied from Lighttp. NGinx supports an alternative header called X-Accel-Redirect.

原文:http://blog.jasny.net/articles/how-i-php-x-sendfile/

相關推薦

PHP下載檔案需要定義的程式碼頭

//返回的檔案 header("Content-type:application/octet-stream"); //按照位元組大小返回 header("Accept-Ranges:bytes"); //顯示檔案大小 file_size一定要提前算好 heade

php下載檔案新增header響應頭

header( 'Content-type:application/octet-stream' ); header( 'Content-Disposition:attachment;filename="' . basename ( $file ). '"' ); hea

php下載檔案(而不是開啟檔案

public function down() { header('content-type:application:json;charset=utf8'); h

PHP 下載檔案到瀏覽器

方法一 a標籤H5屬性download屬性,<a download='test.txt' href='http://www.baidu.com'>下載test.txt檔案</a>

PHP 下載檔案的方法(指定路徑)

//下載指定檔案的方法 public function downdetails($file_path){ header("Content-type:text/html;charset=utf-8"); //$file_path="testMe.txt"; /

php下載檔案並儲存到指定資料夾

php下載圖片並儲存到指定資料夾 function GrabImage($url, $dir, $filename=''){ if(empty($url)){ return false; } $ext = strrchr($url, '.'); if($ext

php 下載檔案,考慮到各種格式,解決下載時部分出現檔案損壞的問題

function dl_file($file){ //First, see if the file exists if (!is_file($file)) { die("<b>404 File not found!</b>")

PHP下載伺服器檔案

PHP從伺服器下載檔案 <?php header("Content-type:text/html;charset=utf-8"); $file_name="聖誕狂歡.jpg"; //下載下來的檔名 //用以解決中文不能顯示出來的問題 $file_name=iconv("

PHP下載APK檔案

PHP下載APK檔案(程式碼如下) /** * //這裡不要隨便列印文字,否則會影響輸出的檔案的 * (例如下載沒問題,但是apk安裝時候提醒解析安裝包錯誤) * @return array */ public function donwApk

php 上傳檔案下載檔案

上傳 /** * 單檔案上傳 * @param array $fileInfo 檔案資訊 是一個數組 * @param string $uploadPATH 檔案上傳預設路徑 * @param bool $imageFlag 是否檢測真實圖片 * @param arr

PHP實現下載檔案

$length = filesize($file); $type = mime_content_type($file); $showname = ltrim(strrchr($file,'/'),'/');

PHP檔案打包下載 zip

<?php $zipname = './photo.zip'; //伺服器根目錄下有資料夾public,其中包含三個檔案img1.jpg, img2.jpg, img3.jpg,將這三個檔案打包下載,並重設下載的目錄結構及檔名 file1/newimg1.jpg, file1/newimg

apache無法解析php檔案,顯示php原始碼或直接下載檔案

我百度了一下午,根本原因是漏了一個php擴充套件:mod_php 安裝完重啟apache就好了。 yum install mod_php 其他解決辦法 羅列一下百度搜到的一些其他解決辦法,本人嘗試無用。   1.找到: AddType application/x

php實現檔案下載

index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <a href="Download.php?filename

php使用新浪雲Storage儲存上傳下載檔案,建立bucket、Bucket 操作、Object 上傳操作,Object 下載操作,Object 刪除操作、Object 複製操作,生成一個外網能夠訪

<?php //新浪雲 Storage PHP use use sinacloud\sae\Storage as Storage; // 方法一:在新浪雲執行環境中時可以不傳認證資訊,預設會從應用的環境變數中取 $s = new Storage();

PHP下載壓縮包檔案

壓縮檔案 1 $zip = new ZipArchive(); 2 // 開啟一個zip文件,ZipArchive::OVERWRITE:如果存在這樣的文件,則覆蓋;ZipArchive::CREATE:如果不存在,則建立 3 $res = $zip->open('test.zip', Z

PHP 配置檔案中open_basedir選項作用防止下載漏洞

open_basedir: 將使用者可操作的檔案限制在某目錄下 如下是php.ini中的原文說明以及預設配置:  ; open_basedir, if set, limits all file operations to the defined directory  ; a

php實現檔案下載連結

1.  test.html建立下載連結: <!DOCTYPE html> <html> <head>     <meta charset="utf-8">

php+html下載檔案

<!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <meta name="viewport" content="width=device-widt

php從伺服器下載檔案到本地

/* *功能:php完美實現下載遠端圖片儲存到本地 *引數:檔案url,儲存檔案目錄,儲存檔名稱,使用的下載方式 *當儲存檔名稱為空時則使用遠端檔案原來的名稱 */ function getImage($url,$save_dir='',$filename='',$