iT邦幫忙

1

PHP 上傳本地文件給client(已解決)

  • 分享至 

  • xImage

各位好我想要server上的php能夠上傳本地的文件給client

以下是我查到的代碼。
server.php

$file = 'D:\1.txt';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}

上面使用者瀏覽 server.php 可以下載 server 端的 1.txt 。
不過我實測下載大檔案,就會斷掉或是太久就失敗。

請問還有什麼好辦法,希望能不要用另外引用其他外部的庫
例如: 不要安裝curl 的庫

我在這篇文章:看到 socket 和 http 都有人使用
https://stackoverflow.com/questions/6914912/streaming-a-large-file-using-php

我在這篇看到 http 設定一些表頭也可以完成。
https://tw511.com/a/01/5797.html

我知道 http 是基於 tcp 的, 所以是不是直接用 socket 會更快。

但是我預想到socket 可能要開一些線程,好像也不是很方便

問題1
上方的程式碼我不確定這個下載的線程,是不是直接都給browser 去處理了。
如果是的話,那我可能大概率會選這種。

但這個方法還是有個缺點,因為他會直接下載檔案而不會顯示畫面

而假如我的server.php 想要

echo "<h1>hello</h1>";

就會沒有畫面。

所以到這,我又覺得好像也不是很好。

請問各為有誰知道這兩種的優缺點,或是有其他更推薦的方式。

wiseguy iT邦超人 1 級 ‧ 2022-12-24 12:10:09 檢舉
槽點太多到不知從何吐起 ....
1. 沒有所謂 「server 上傳到 client 」這個情況。server 是被動接受 request 再 response 而已。
2. 你的所謂 server.php 程式,就只是下載檔案的 http head 再加上抓檔來輸出,就跟不用任何程式單純把 1.txt 擺在 server Document root 目錄中,下載的狀況一樣。
3. socket 那是另一個故事了,你不能既要 http 又要 socket 兩個 protocol 並行。
4. 「有個缺點,會直接下載檔案而不會顯示畫面」這顯然誤會很大。是顯示還是下載,是 http 檔頭被瀏覽器解讀的結果。結果只會有一個。比如看到圖檔瀏覽器會顯示,看到 html 瀏覽器會顯示,看到你 server.php 裡輸出的「Content-Disposition: attachment ...」瀏覽器就下載。完全沒毛病。你要他既下載又顯示,才有毛病。當然,要做到「既下載又顯示」不是不行。內嵌 iframe 進行下載同時又有畫面是做得到的。但這是兩條 http。
建議再多了解一下 http。另外也可以直接說你要的效果是什麼。不然這觀念完全不正確的問題,答題人無法理解你的需求,更別說答出你要的答案。
phantom_0 iT邦新手 5 級 ‧ 2022-12-24 13:07:01 檢舉
不好意思 我最近才學PHP 一個多月, 不知道 太多的細節, 我會提出這樣的問題的原因是一般 html 上傳到 PHP 後端時, 你只須要 簡單的表單<form> 就能上傳本地檔案到 後端, 但我不知道後端是不是也能簡單的傳送本地檔案給前端。 我知道直接 url webroot 的檔案 就相當下載,但我想要的是前端點選下載後,後端自己傳送檔案到client 。 如果沒辦法的話, 我也只能像你說的 第一點 server 被動處理。

另外一個問題也想請教您,如果server 無法主動發起連線的話 websocket 是不是 可以做到。

還是很感謝您的回答 幫助了不少
1.使用者點選檔案下載
php 裡面崁入 html語法 <a href="Resources/path.pdf">LINK </a>
也就是讓使用者看到下載的連結

2.
WebSocket 是網路協定的一種, Client 可以透過此協定與Server 做溝通
php實現上 .可參考[Day18]第十七章-聊天室開頭的閒聊(二)-php websocket函數
https://ithelp.ithome.com.tw/articles/10196207

但我沒再用php了..改用b4x實現
b4x winsocket範例
https://studio.youtube.com/video/TMrzQdk3n3c/edit
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答