php下載大文件
㈠ php文件下載文件損壞的問題
經過簡單測試,下載大文件(>50M)時會出現,斷節問題,還有對中文名字的文件支持不好,甚至返回404,下載的文件打不開也許是因為沒有判斷是否讀取完,因為 fread不一定能一次性將一個文件讀入內存,這樣伺服器有壓力,伺服器為了穩定可能對該內存區進行了優化,下面貼上我修改的代碼,寫的不好望指正,共同進步:
functiondownload($file_url,$new_name=''){
$file_url=iconv('utf-8','gb2312',$file_url);
//將編碼轉為支持中英文的gb2312編碼
if(!isset($file_url)||trim($file_url)==''){
return'500';
}
if(!file_exists($file_url)){//檢查文件是否存在
return'404';
}
$file_name=basename($file_url);
$file_type=explode('.',$file_url);
$file_type=$file_type[count($file_type)-1];
$file_name=trim($new_name=='')?$file_name:urlencode($new_name).'.'.$file_type;
//輸入文件標簽
header("Content-type:application/octet-stream");
header("Accept-Ranges:bytes");
header("Accept-Length:".filesize($file_url));
header("Content-Disposition:attachment;filename=".$file_name);
$file_type=fopen($file_url,'r');//打開文件
//輸出文件內容
$file_size=filesize($file_url);//獲取文件大小
$buffer=1024;//定義1KB的緩存空間
$file_count=0;//計數器,計算發送了多少數據
while(!feof($file_type)&&($file_size>$file_count)){
//如果文件還沒讀到結尾,且還有數據沒有發送
$senddata=fread($file_type,$buffer);
//讀取文件內容到緩存區
$file_count+=$senddata;
echo$senddata;
}
//echofread($file_type,filesize($file_url));
fclose($file_type);
}
//最主要的原因找到了,保存PHP源碼時要用UTF-8 無ROM格式編碼保存,否則每個文件頭部都會有 EF BB 這兩個位元組
㈡ PHP 怎麼獲取超大文件大小,文件大於8G+
這個真沒辦法,用主機空間有大小限制的,普通的免費空間只有8m,收費的再大也不過128m限制
㈢ php下載函數,在ie上不能下載大於2G的文件,當文件大於2G的時候,下載下的壓縮文件是0KB的,求大神指點。
/**
* 發送文件
*
* @author: legend([email protected])
* @link: http://www.ugia.cn/?p=109
* @description: send file to client
* @version: 1.0
*
* @param string $fileName 文件名稱或路徑
* @param string $fancyName 自定義的文件名,為空則使用filename
* @param boolean $forceDownload 是否強制下載
* @param integer $speedLimit 速度限制,單位為位元組,0為不限制,不支持windows伺服器
* @param string $$contentType 文件類型,默認為application/octet-stream
*
* @return boolean
*/
function sendFile($fileName, $fancyName = '', $forceDownload = true, $speedLimit = 0, $contentType = '')
{
if (!is_readable($fileName))
{
header("HTTP/1.1 404 Not Found");
return false;
}
$fileStat = stat($fileName);
$lastModified = $fileStat['mtime'];
$md5 = md5($fileStat['mtime'] .'='. $fileStat['ino'] .'='. $fileStat['size']);
$etag = '"' . $md5 . '-' . crc32($md5) . '"';
header('Last-Modified: ' . gmdate("D, d M Y H:i:s", $lastModified) . ' GMT');
header("ETag: $etag");
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModified)
{
header("HTTP/1.1 304 Not Modified");
return true;
}
if (isset($_SERVER['HTTP_IF_UNMODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_UNMODIFIED_SINCE']) < $lastModified)
{
header("HTTP/1.1 304 Not Modified");
return true;
}
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
{
header("HTTP/1.1 304 Not Modified");
return true;
}
if ($fancyName == '')
{
$fancyName = basename($fileName);
}
if ($contentType == '')
{
$contentType = 'application/octet-stream';
}
$fileSize = $fileStat['size'];
$contentLength = $fileSize;
$isPartial = false;
if (isset($_SERVER['HTTP_RANGE']))
{
if (preg_match('/^bytes=(d*)-(d*)$/', $_SERVER['HTTP_RANGE'], $matches))
{
$startPos = $matches[1];
$endPos = $matches[2];
if ($startPos == '' && $endPos == '')
{
return false;
}
if ($startPos == '')
{
$startPos = $fileSize - $endPos;
$endPos = $fileSize - 1;
}
else if ($endPos == '')
{
$endPos = $fileSize - 1;
}
$startPos = $startPos < 0 ? 0 : $startPos;
$endPos = $endPos > $fileSize - 1 ? $fileSize - 1 : $endPos;
$length = $endPos - $startPos + 1;
if ($length < 0)
{
return false;
}
$contentLength = $length;
$isPartial = true;
}
}
// send headers
if ($isPartial)
{
header('HTTP/1.1 206 Partial Content');
header("Content-Range: bytes $startPos-$endPos/$fileSize");
}
else
{
header("HTTP/1.1 200 OK");
$startPos = 0;
$endPos = $contentLength - 1;
}
header('Pragma: cache');
header('Cache-Control: public, must-revalidate, max-age=0');
header('Accept-Ranges: bytes');
header('Content-type: ' . $contentType);
header('Content-Length: ' . $contentLength);
if ($forceDownload)
{
header('Content-Disposition: attachment; filename="' . rawurlencode($fancyName). '"');
}
header("Content-Transfer-Encoding: binary");
$bufferSize = 2048;
if ($speedLimit != 0)
{
$packetTime = floor($bufferSize * 1000000 / $speedLimit);
}
$bytesSent = 0;
$fp = fopen($fileName, "rb");
fseek($fp, $startPos);
//fpassthru($fp);
while ($bytesSent < $contentLength && !feof($fp) && connection_status() == 0 )
{
if ($speedLimit != 0)
{
list($usec, $sec) = explode(" ", microtime());
$outputTimeStart = ((float)$usec + (float)$sec);
}
$readBufferSize = $contentLength - $bytesSent < $bufferSize ? $contentLength - $bytesSent : $bufferSize;
$buffer = fread($fp, $readBufferSize);
echo $buffer;
ob_flush();
flush();
$bytesSent += $readBufferSize;
if ($speedLimit != 0)
{
list($usec, $sec) = explode(" ", microtime());
$outputTimeEnd = ((float)$usec + (float)$sec);
$useTime = ((float) $outputTimeEnd - (float) $outputTimeStart) * 1000000;
$sleepTime = round($packetTime - $useTime);
if ($sleepTime > 0)
{
usleep($sleepTime);
}
}
}
return true;
}
㈣ Thinkphp在下載4MB以上的rar壓縮文件時,下來後是0KB,急求解決!其他文件可以實現。
你先找找別的方法,最後實在不行的話你就把用戶上傳的所有文件放在一個文件夾里。用php遍歷那個文件夾給他們輸到頁面上,然後給那些文件加上下載的連接。應該沒啥問題。。
下載連接:http://www.域名.com/文件夾/要下載的文件.rar
㈤ PHPDISK上傳大文件,可上傳任意大小的文件的文件,但下載
您好,我本身也是PHPDISK的使用者,誠摯為您解答:
首先我也是遇到了這個問題,改了MAX UPLOAD SIZE 和 MAX POST都不變,下載檔案也是一超過一定大小就出錯,所以我當時認為一定是某個PHP設定跟某種大小有關的惹的禍。
於是,我慢慢一條一條看,仔細看php.ini看看能不看出個甚麼端倪
後來終於找到一項設定和大小有關,叫做memory_limit = 128M
原來php預設的執行佔用記憶體限制是128M,若使用電腦超過128M的記憶體則拒絕執行
所以你只要更改 memory_limit = 128M 改成更大的數值就搞定了
_____________________________________________
我自己是用WINDOWS版的X64 PHP5.5+Apache server2.4
希望我有幫助到您 :)
㈥ php文件怎麼下載
如果是PHP頁面的話是不能直接下載的,除非更改文件後綴或者壓縮成rar等其他格式的壓縮包才能下載……
像你說的這種情況,通常是因為你想要下載的種子文件已經被刪除或者你沒有登錄提供下載的網站,所以返回了一個下載失敗的頁面,並被保存成PHP格式。你用記事本打開這個php文件就可以看到裡面的內容了,可以百分百的肯定是下載失敗提示的頁面代碼。要解決這個問題最好的辦法就是換個站點下載,或者重新搜索查找下載你所需要的文件。
㈦ php 批量大文件上傳下載如何實現
1.首先還是查看環境是否支持超大容量上傳的支持,500M以上的文件通常為視頻文件;
2.即然他要上傳500M以上的文件,估計伺服器性能必定非同凡想,所以暫可不考慮伺服器硬體配置問題,但一定要考慮到網速問題,建議1000M以上出入速率,如少於這個數,你可以放棄這個方案了;
3.前面硬體都過關了,但程序也要加強了,一下上傳500M是哪種語言都不能實現的,唯一解決方案,文件切割,如迅雷下載原理一樣(採用續點上傳),分成若干小塊,然後全部上傳完畢以後,再進行文件合成。
4.至於PHP的文件切割,切割後上傳,以及文件合並,此類代碼網上有許多,樓主可查詢並選擇適合你的代碼,實現你的功能!
㈧ php curl get 下載遠程zip文件保存在本地例子
<?php
if($_POST['submit']){
$url=$_POST['url']; //取得提交過來的地址http://hu60.cn/wap/0wap/addown.php/fetion_sms.zip
$url=urldecode($url);
$fname=basename("$url"); //返迴路徑中的文件名部分 fetion_sms.zip
$str_name=pathinfo($fname); //以數組的形式返迴文件路徑的信息
$extname=strtolower($str_name['extension']); //把擴展名轉換成小寫
//$uptypes=explode(",",$forum_upload); //取得可以上傳的文件格式
//$size=getFileSize($url);
$time=date("Ymd",time());
$upload_dir="./upload/";//上傳的路徑
$file_name=$time.rand(1000,9999).'.'.$fname;
$dir=$upload_dir.$file_name;//創建上傳目錄
//判斷目錄是否存在 不存在則創建
if(!file_exists($upload_dir)){
mkdir($upload_dir,0777,true);
}
$contents=curl_download($url,$dir);
if($contents){
echo "下載成功";
}else{
echo "下載失敗";
}
}
function curl_download($url, $dir) {
$ch = curl_init($url);
$fp = fopen($dir, "wb");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
$res=curl_exec($ch);
curl_close($ch);
fclose($fp);
return $res;
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>遠程下載文件</title>
<form name="upform" method="post" action="" enctype='multipart/form-data'>
<input name='url' type='text' size='20'/>
<input type='submit' name='submit' value='遠程下載'/>
</form>
</body>
</html>
㈨ php實現文件下載代碼
簡單的文件下載只需要使用HTML的連接標記<a>,並將屬性href的URL值指定為下載的文件即可。所示:
<a href=」http://www.*****.net/download/book.rar」>下載文件</a>
如果通過上面的代碼實現文件下載,只能處理一些瀏覽器不能默認識別的MIME類型文件,例如當訪問book.rar文件時,瀏覽器並沒有直接打開,而是彈出一個下載提示框,提示用戶「下載」還是「打開」等處理方式。但如果需要下載後綴名為.html的網頁文件、圖片文件及PHP程序腳本文件等,使用這種連接形式,則會將文件內容直接輸出到瀏覽器中,並不會提示用戶下載。
為了提高文件的安全性,不希望在<a>標簽中給出文件的鏈接,則必須向瀏覽器發送必要的頭信息,以通知瀏覽器將要進行下載文件的處理。PHP使用header()函數發送網頁的頭部信息給瀏覽器,該函數接收一個頭信息的字元串作為參數。文件下載需要發送的頭信息包括以下三部分,通過調用三次header()函數完成。以下載圖片test.gif為例,需要發送的頭信息的所示:
header(『Content-Type:imge/gif'); //發送指定文件MIME類型的頭信息
header(『Content-Disposition:attachment; filename=」test.gif」『); //發送描述文件的頭信息,附件和文件名
header(『Content-Length:3390′); //發送指定文件大小的信息,單位位元組
如果使用header()函數向瀏覽器發送了這三行頭信息,圖片test.gif就不會直接在瀏覽器中顯示,而讓瀏覽器將該文件形成下載的形式。在函數header()中,「Content-Type」指定了文件的MIME類型,「Content_Disposition」用於文件的描述,值「attachment;
filename=」test.gif」」說明這是一個附件,並且指定了下載後的文件名,「Content_Length」則給出了被下載文件的大小。
設置完頭部信息以後,需要將文件的內容輸出到瀏覽器,以便進行下載。可以使用PHP中的文件系統函數將文件內容讀取出來後,直接輸出給瀏覽器。最方便的是使用readfile()函數,將文件內容讀取出來直接輸出。下載文件test.gif的所示:
<?php
$filename = "test.gif";
header('Content-Type:image/gif'); //指定下載文件類型
header('Content-Disposition: attachment; filename="'.$filename.'"'); //指定下載文件的描述
header('Content-Length:'.filesize($filename)); //指定下載文件的大小
//將文件內容讀取出來並直接輸出,以便下載
readfile($filename);
?>
上面如果碰到中文名字就會無法正常下載了,對於中文名字下載文件我又找到一個文件下載實例代碼
<?php
header("Content-type:text/html;charset=utf-8");
// $file_name="cookie.jpg";
$file_name="聖誕狂歡.jpg";
//用以解決中文不能顯示出來的問題
$file_name=iconv("utf-8","gb2312",$file_name);
$file_sub_path=$_SERVER['DOCUMENT_ROOT']."marcofly/phpstudy/down/down/";
$file_path=$file_sub_path.$file_name;
//首先要判斷給定的文件存在與否
if(!file_exists($file_path)){
echo "沒有該文件文件";
return ;
}
$fp=fopen($file_path,"r");
$file_size=filesize($file_path);
//下載文件需要用到的頭
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length:".$file_size);
Header("Content-Disposition: attachment; filename=".$file_name);
$buffer=1024;
$file_count=0;
//向瀏覽器返回數據
while(!feof($fp) && $file_count<$file_size){
$file_con=fread($fp,$buffer);
$file_count+=$buffer;
echo $file_con;
}
fclose($fp);
?>
header("Content-type:text/html;charset=utf-8")的作用:在伺服器響應瀏覽器的請求時,告訴瀏覽器以編碼格式為UTF-8的編碼顯示該內容
關於file_exists()函數不支持中文路徑的問題:因為php函數比較早,不支持中文,所以如果被下載的文件名是中文的話,需要對其進行字元編碼轉換,否則file_exists()函數不能識別,可以使用iconv()函數進行編碼轉換
$file_sub_path() 我使用的是絕對路徑,執行效率要比相對路徑高
Header("Content-type: application/octet-stream")的作用:通過這句代碼客戶端瀏覽器就能知道服務端返回的文件形式
Header("Accept-Ranges: bytes")的作用:告訴客戶端瀏覽器返回的文件大小是按照位元組進行計算的
Header("Accept-Length:".$file_size)的作用:告訴瀏覽器返回的文件大小
Header("Content-Disposition: attachment; filename=".$file_name)的作用:告訴瀏覽器返回的文件的名稱
以上四個Header()是必需的
fclose($fp)可以把緩沖區內最後剩餘的數據輸出到磁碟文件中,並釋放文件指針和有關的緩沖區
㈩ 怎麼優化php因為下載導致負載過大
1、大文件的下載會佔用很大的流量,並且對於非SCSI硬碟來說,大量文件下載會消耗CPU,使得網站響應能力下降。因此,盡量不要提供超過2M的大文件下載,如果需要提供,建議將大文件放在另外一台伺服器上。
2、將文件放在不同的主機上,提供不同的鏡像供用戶下載,這樣一來就可以把幾種的流量分散到各台伺服器上,減輕主伺服器壓力,另外訪問流量大對伺服器帶寬和流量也是一個很大的考驗,因此,大流量站點需要盡可能的選擇大帶寬不限流量美國伺服器 。