中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

safari如何下載文件

發布時間:2021-08-04 10:13:08 來源:億速云 閱讀:408 作者:小新 欄目:開發技術

這篇文章主要介紹了safari如何下載文件,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

如何下載文件?

方法一、直接通過nginx下載靜態文件

如果文件是保存在服務器上面的,可以直接用nginx下載文件

比如說可以供用戶下載pdf文件,那么我的nginx配置可以是這樣子的:

location ~ /document/(.*)\.pdf$ {
  root /home/nemo/myfile;
  try_files /$uri 404;
}

按照上面的配置,當我請求 http://fbd.intelleeegooo.cc/document/test.pdf 的時候,我服務器上的位于 /home/nemo/myfile/document/test.pdf 的這個文件就被下載了。當找不到相應的文件的時候,就會返回 404 。

方法二、通過php讀取文件并下載

但上面這種方式是所有人都可以下載pdf文件的,假如說下載文件這個動作是與賬號有關的,比如說某用戶只能下載某些文件,那么就需要在php里面對用戶賬戶進行處理并且下載相關文件。

看我在index.php里面這段示例代碼,這段代碼的功能下載test.txt文件

<?php
$filePath = '/home/nemo/fun/testdownloadfile/test.txt';
$fileName = 'test.txt';
readfile($filePath);

比如說我開了一個8764端口,nginx配置如下:

server {
 listen 8764;
 server_name xx.xx.xx;
 ……
 ……
 ……
 location / {
 root   /home/nemo/fun/testdownloadfile;
  fastcgi_pass 127.0.0.1:xxxx;
  fastcgi_index index.php;
  include   fastcgi.conf;
 }
}

配置文件里面的 fastcgi_pass 后面可以是ip+端口,也可以是unix_socket的路徑。具體根據你安裝的php的里面的 php-fpm.conf 的 listen 來決定。

我們用 command + option + i 快捷鍵打開瀏覽器的調試模式,當我在瀏覽器里面請求 http://xx.xx.xx:8764/ 的時候,結果是瀏覽器直接把txt文件的內容顯示在了頁面上。

看一下調試模式里面的這個請求,它的response header如下:

safari如何下載文件

可以看到它里面的 Content-Type 是 text/html ,表示是一個html文件,所以瀏覽器就直接展示在頁面上了。【關于常用的一些 Content-Type ,可以見本文最后】

那么我改一下代碼,在里面設置一下header,示例代碼如下:

<?php
$filePath = '/home/nemo/fun/testdownloadfile/test.txt';
$fileName = 'test.txt';
header('Content-Disposition: attachment; filename=' . $fileName);
readfile($filePath);

我在chrome里面新建一個tab頁輸入url http://fbd.intelleeegooo.cc/document/test.pdf 的時候,成功下載了這個文件,如下圖所示:

safari如何下載文件

但是我在safari里面的時候,下載下來的文件多了一個 html 后綴,如下圖所示

safari如何下載文件

我再改下代碼,設置 Content-Type ,看如下示例代碼:

<?php
$filePath = '/home/nemo/fun/testdownloadfile/test.txt';
$fileName = 'test.txt';
header('Content-Type: application/octet-stream;charset=utf-8');
header('Content-Disposition: attachment; filename=' . $fileName);
readfile($filePath);

這樣改過之后,在safari里面下載的文件就是正常的了,不帶html后綴的。

2.2 在php里面讀取并輸出文件的幾種方法

在設置完header信息之后,下面幾種方法都可以用來輸出文件

file_get_contents() ,這個方法是把文件的內容以字符串的形式全部讀取到內存里面。當文件比較大的時候,會超過內存限制

$content = file_get_contents($filePath);
echo $content;
file() ,將文件以行的形式全部讀取到數組中。當文件比較大的時候,會超過內存限制
$f = file($filePath);
while(list($line, $content) = each($f)) { // $line是int類型表示是第幾行(從0開始), $content是字符串類型表示這一行的內容
 echo $content;
}
readfile() ,讀取文件并且寫入到輸出緩沖區。這種方式可以輸出大文件,讀取單個文件不會超出內存限制。
ob_end_clean();
readfile($filePath);

但是看官方手冊上面的這段話

safari如何下載文件

readfile自身不會導致任何內存問題。如果出現內存不足的問題,使用 ob_get_level() 確保輸出緩存已經關閉。

但 readfile() 方法還是可以會引起內存耗盡

readfile實際上還是需要采用MMAP(如果支持), 或者是一個固定的buffer去循環讀取文件, 直接輸出。

fopen() ,這就類似于C語言里面的讀取文件。fopen每次可以指定讀取某個塊大小的內容,可以讀入大文件。不會超過內存限制

$file = @fopen($filePath,"rb");
while(!feof($file)) {
 print(@fread($file, 1024*8));
 ob_flush();
 flush();
}

2.3 內存限制

在php的配置文件 php.ini 里面,有一個 memory_limit 這個設置項,設置的是每個腳本可以分配的內存。

如下圖所示,我自己放寬了一點變成了256M,默認是128M

safari如何下載文件

正如上面所說,讀取大文件的時候,可能會內存耗盡。

php里面有 ini_set() 方法可以在腳本運行時保持新的值,在腳本結束時恢復。

并不是 php.ini 里面的所有設置項都可以被修改,所有可以被 ini_set() 修改的選項可以從 官方手冊里面的這個清單 知曉

有一種方法可以在執行的時候動態的修改腳本可以使用的內存大小,而不一定非要修改php.ini文件,畢竟php.ini是針對全局的。

在腳本里面動態的修改一些設置,只對該腳本有效,實際上并不真正地修改 php.ini 文件。

2.5 時間限制

一般情況下,使用php下載文件的時候,會加上一行 set_time_limit(0); ,表示不限制這個php腳本執行的時間

<?php
$filePath = '/home/nemo/fun/testdownloadfile/test.txt';
$fileName = 'test.txt';

set_time_limit(0);
header('Content-Type: application/octet-stream;charset=utf-8');
header('Content-Disposition: attachment; filename=' . $fileName);
readfile($filePath);

看下 官方手冊上 的解釋

safari如何下載文件

Content-Disposition 相關解釋

在常規的HTTP應答中, Content-Disposition 消息頭指示回復的內容該以何種形式展示,是以內聯的形式(即網頁或者頁面的一部分),還是以附件的形式下載并保存到本地

Content-Disposition 消息頭最初是在MIME標準中定義的,HTTP表單及POST 請求只用到了其所有參數的一個子集。只有form-data以及可選的name和filename三個參數可以應用在HTTP場景中

inline

inline展示txt文件
看如下示例代碼,設置inline內聯,將上面的test.txt文件在瀏覽器里面展示

<?php
$filePath = '/home/nemo/fun/testdownloadfile/test.txt';
$fileName = 'test.txt';
header('Content-Disposition: inline; filename=' . $fileName);
readfile($filePath);

常用的幾種 Content-Type 類型

下面列一下常用的幾種Content-Type

  • text/html ,內容是html格式

  • text/plain ,內容是純文本格式

  • image/gif , gif圖片格式

  • image/jpeg , jpg圖片格式

  • image/png , png圖片格式

  • multipart/form-data ,常見的 POST 數據提交的方式。當需要上傳文件時,會用到這種類型

  • application/json ,消息主體是序列化后的 JSON 字符串

  • application/octet-stream ,二進制流數據。一般在下載文件的時候比較常見

  • application/x-www-form-urlencoded , 瀏覽器的原生form表單,提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key和val都進行了URL轉碼

感謝你能夠認真閱讀完這篇文章,希望小編分享的“safari如何下載文件”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

花莲市| 浠水县| 华安县| 万山特区| 军事| 安达市| 丽水市| 竹山县| 浦县| 宁德市| 荥经县| 仲巴县| 北辰区| 福清市| 岳池县| 瑞丽市| 霍城县| 延庆县| 张家港市| 湖南省| 墨脱县| 固原市| 河曲县| 新巴尔虎右旗| 罗定市| 佛山市| 石狮市| 瑞安市| 景东| 甘德县| 浮梁县| 克东县| 都兰县| 漯河市| 巴马| 长泰县| 新龙县| 宁安市| 应城市| 昌江| 富川|