<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] # PHP實現 ~~~ $pathToFile = 'myfile.csv';//文件絕對路徑 $downloadName = 'downloadFile.csv';//下載后的文件名 //輸入文件標簽 Header("Content-type: application/octet-stream"); Header("Accept-Ranges: bytes"); Header("Accept-Length: " . filesize($pathToFile)); Header("Content-Disposition: filename=" . $downloadName); //輸出文件內容 $file = fopen($pathToFile, "r"); echo fread($file, filesize($pathToFile)); fclose($file); //或 //readfile($pathToFile); ~~~ 其中fread()與readfile()的區別可以參考 https://segmentfault.com/q/1010000000647226 但是有時候為了節省帶寬,避免瞬時流量過大而造成網絡堵塞,就要考慮下載限速的問題 # 下載文件限速 ~~~ $pathToFile = 'myfile.csv';//文件絕對路徑 $downloadName = 'downloadFile.csv';//下載后的文件名 $download_rate = 30;// 設置下載速率(30 kb/s) if (file_exists($pathToFile) && is_file($pathToFile)) { header('Cache-control: private');// 發送 headers header('Content-Type: application/octet-stream'); header('Content-Length: ' . filesize($pathToFile)); header('Content-Disposition: filename=' . $downloadName); flush();// 刷新內容 $file = fopen($pathToFile, "r"); while (!feof($file)) { print fread($file, round($download_rate * 1024));// 發送當前部分文件給瀏覽者 flush();// flush 內容輸出到瀏覽器端 sleep(1);// 終端1秒后繼續 } fclose($file);// 關閉文件流 } else { abort(500, '文件' . $pathToFile . '不存在'); } ~~~ 此時出現一個問題,當$download_rate>1kb時,文件正常下載;當$download_rate<1kb時,文件要等一會兒才下載,究其原因是因為buffer的問題。 * buffer是一個內存地址空間,Linux系統默認大小一般為4096(1kb),即一個內存頁。主要用于存儲速度不同步的設備或者優先級不同的設備之間傳辦理數據的區域。舉個例子,你打開文本編輯器編輯一個文件的時候,你每輸入一個字符,操作系統并不會立即把這個字符直接寫入到磁盤,而是先寫入到buffer,當寫滿了一個buffer的時候,才會把buffer中的數據寫入磁盤。同樣的道理,當執行echo,print的時候,輸出并沒有立即通過tcp傳給客戶端瀏覽器顯示,而是將數據寫入php buffer。php output_buffering機制,意味在tcp buffer之前,建立了一新的隊列,數據必須經過該隊列。當一個php buffer寫滿的時候,腳本進程會將php buffer中的輸出數據交給系統內核交由tcp傳給瀏覽器顯示。所以,數據會依次寫到這幾個地方echo/pring -> php buffer -> tcp buffer -> browser。資料:http://blog.csdn.net/superhosts/article/details/42292053 * 在沒有開啟緩存時,腳本輸出的內容都在服務器端處于等待輸出的狀態,flush()可以將等待輸出的內容立即發送到客戶端。 * 開啟緩存后,腳本輸出的內容存入了輸出緩存中,這時沒有處于等待輸出狀態的內容,你直接使用flush()不會向客戶端發出任何內容。而ob_flush()的作用就是將本來存在輸出緩存中的內容取出來,設置為等待輸出狀態,但不會直接發送到客戶端,這時你就需要先使用ob_flush()再使用flush(),客戶端才能立即獲得腳本的輸出。 * 以及這篇文章同樣講述了ob_flush()和flush()的區別http://www.laruence.com/2010/04/15/1414.html 但是這種方法將文件內容從磁盤經過一個固定的 buffer 去循環讀取到內存,再發送給前端 web 服務器,最后才到達用戶。當需要下載的文件很大的時候,這種方式將消耗大量內存,甚至引發 php 進程超時或崩潰,接下來就使用到X-Sendfile。 # X-Sendfile X-Sendfile 是一種將文件下載請求由后端應用轉交給前端 web 服務器處理的機制,它可以消除后端程序既要讀文件又要處理發送的壓力,從而顯著提高服務器效率,特別是處理大文件下載的情形下。 我是用的nginx,所以apache請參考https://tn123.org/mod_xsendfile/ ①首先在配置文件中添加 ~~~ location /download/ { internal; root /some/path;//絕對路徑 } ~~~ internal 表示這個路徑只能在 Nginx 內部訪問,不能用瀏覽器直接訪問防止未授權的下載 注意添加在location / {...}的前面 這樣你在代碼中使用時,文件路徑就可以寫成“/download/myfile.csv” ②重啟Nginx,寫代碼 ~~~ $pathToFile = 'myfile.csv';//文件絕對路徑 $downloadName = 'downloadFile.csv';//下載后的文件名 $download_rate = 30;// 設置下載速率(30 kb/s) if (file_exists($pathToFile) && is_file($pathToFile)) { return (new Response())->withHeaders([ 'Content-Type' => 'application/octet-stream', 'Content-Disposition' => 'attachment;filename=' . $downloadName, 'X-Accel-Redirect' => $pathToFile,//讓Xsendfile發送文件 'X-Sendfile' => $pathToFile, 'X-Accel-Limit-Rate' => $download_rate, ]); }else { abort(500, '文件' . $pathToFile . '不存在'); } ~~~ ![](https://box.kancloud.cn/7d916847a124b6967e6dfb0a66462408_1562x482.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看