iT邦幫忙

0

關於 readfile 及 標頭檔名宣告的應用

  • 分享至 

  • xImage

OK,可能從標題還看不來問題。

簡單來說。就是做

header('Content-Disposition: inline; filename="test.pdf"');

但沒作用的問題。
不過這是在有條件的情況下就是了。

其實我的程式碼如下

$this->load->library('s3');
$file = 'download/' . $getFileData;
$getFile = $this->s3->getFile($file);
if ($fileinfo['extension'] == 'pdf') {
    header('Content-type: application/pdf');
    header('Content-Disposition: inline; filename="' . ($mask ? $mask : basename($file)) . '"');
    header('Content-Transfer-Encoding: binary');
    header('Accept-Ranges: bytes');
    } else {
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="' . ($mask ? $mask : basename($file)) . '"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    }       
    readfile($this->s3->s3Url . "/" . $file, 'rb');
    //echo $getFile['Body'];

或許有人看出來了,其實我是讀取S3的東西。
原來的寫法是直接送出Body內容的。
如果是非PDF的情況下,直接下載檔案是可以正確的讀到我指定的 filename 名稱。
但問題就出在因為PDF並不想要直接下載,而是變成預覽。

但在預覽的情況下,它會解析成檔名是 index.php 。無法正確的讀入我設定的 filename

要先說明,其實如果不讀取S3的檔案,而是讀取本機內的檔案。在PDF的預覽畫面下,是可以出現我指定的名字。

我網路上查到的資料都是針對下載的。
雖然要找到幾個也是針對PDF預覽的名稱。但都不是我要的。

想問問廣大的大哥們,看看是否有人曾經有碰過這類似的問題。給我你們的經驗吧!!!

看更多先前的討論...收起先前的討論...
淺水員 iT邦大師 6 級 ‧ 2022-08-02 17:58:19 檢舉
沒用過 s3,也許可以比較客戶端收到的資料。
看正常顯示檔名跟不正常顯示檔名差在哪裡。
其實我有看標頭宣告了。
認真來說都有正常宣告過來的。
但PDF就是....一個會吃一個不吃。快搞死我了
fillano iT邦超人 1 級 ‧ 2022-08-03 08:40:44 檢舉
如果關鍵是url,把url改成像 index.php/$file 這樣的模式?
@fillano
其實我正打算用RW規則這樣幹試試。我也是猜測會不會是URL。
不過其實這點也說不太過去就是了。

畢竟不讀S3的檔案。其實是可以正常的。這情況只發生在讀取S3檔案才會這樣。
淺水員 iT邦大師 6 級 ‧ 2022-08-03 15:34:15 檢舉
好奇兩種狀況(readfile 跟 $getFile['body'])的 header 跟 body 有完全一樣嗎?
認真來說是不一樣。使用 $getFile['body'] 會由S3去做輸出處理。
其實如果用getFile的話。我標頭宣告也不太需要。會自動傳送。
但後來因為需要PDF預覽的情況。所以我才處理了標頭宣告的方式。

使用 readfile 的方式,其實就是直接去載入 url 的檔案了。
本來想說這樣可以應用。
但不知為何還是有問題。

我今天剛好忙其它事,所以還沒空去做其它的方式。有研究原因出來後。我會回報一下的。
hi
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
淺水員
iT邦大師 6 級 ‧ 2022-08-02 19:34:18

我用下列程式碼測試

//index.php
$file = 'document.pdf'; //實體檔案
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="aaa.pdf"');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
readfile($file, 'rb');
  • edge、chrome 的 title 會顯示為 index.php,但是預覽畫面中點選「儲存」時,檔名預設是 aaa.pdf
  • firefox 則是 title 跟「儲存」都是 aaa.pdf

目前我偏向這是瀏覽器的問題
如果很在意 title 的話
可以用全畫面的 iframe 來讀 pdf
這樣外層的 html 就可以設定 title 了

title出現index這沒問題。本來就沒在意這些。
重點在於你剛說的「儲存」,在意的是儲存後的檔名。

認真來說,其實我按儲存它也不會吃我設定的檔名。
而是index.php做為檔名。

不過,就如我上面說的,這種情況只有在取用放在S3的檔案時才會發生。
讀本地檔處理則不會。

我現在是偏向找其它的原因試試中。

我要發表回答

立即登入回答