2017-04-22 33 views
2

我要創建文件共享平臺,但PHP有一些bug有關它。我只是用FREAD得到任何文件(exe,pdf,docx,ppt and etc)然後創建隨機名稱和.txt extension.So文本文件時,用戶要下載此文件的文本,我創建隨機文件夾,並在該文件夾內創建具有用戶想要下載的相同文本的文件,然後給出與用戶上傳的文件版本相同的擴展名,並強制用戶下載它。 但是,當用戶下載文件,例如壓縮文件,然後如果用戶想打開,它說因爲不支持格式打開失敗。這發生在我嘗試使用docx,pdfs,zips和那種文件(不是txt,html,css,c文件)。php保存任何文件的文本不能正常工作?

例如:我強制用戶使用他上傳的相同擴展名下載,例如用戶上傳的zip文件,我用fread讀取文本,然後將該文本保存在數據庫或文本文件中,然後如果用戶想要下載該文件,我只是創建文件,並給它的zip擴展名,然後強制用戶下載它,但一旦用戶上傳這個文件,然後如果用戶想打開它失敗,但它應該打開zip文件,因爲該文件的內容文本是完全一樣的用戶上傳到服務器

回答應該包含以下內容:

1)爲什麼發生這種情況如何解決此問題?

2)什麼是理想的解決方案?

3)是安全的做到這一點?

+0

您所設定的標準答案,當好事這個問題首先是沒有意義的,爲什麼要考慮可執行文件或包含二進制文件的文件?難道你不能創建一個zip文件並在其中添加上傳的文件嗎? – Gntem

+0

@ Mr.Phoenix謝謝you.yeah我可以做到這一點,但我需要能夠閱讀這些文件,因爲我會向用戶顯示此文件的內容,它可以用不同的方式,例如,如果它是pdf ,當我完成我的PDF閱讀器時,它將是可讀的,當它是zip文件時,它不會有預覽,這可以類似於dropbox。例如,如果我上傳zip到dropbox然後如果我將它重命名爲txt文件,它會顯示我認爲我可以用這種方式存儲任何文件,所以當我的閱讀器準備就緒時,我可以在將來使用每種格式。但是,這個問題發生了 – Alex

回答

0
  1. 發生這種情況是因爲windows知道應用程序只是從擴展中打開文件文件。如果您將文件重命名爲something.txt,那麼編輯器總是希望將其打開。

  2. 有沒有這樣的事情作爲理想解決方案。解決方法是將文件與原始名稱(可能在某些獨特的部分以防止重複)存儲在非公共可讀目錄中,而不設置執行位。要訪問該文件,您可以創建一個代理腳本,該代理腳本返回該文件並顯示應該下載的標題(也可能是原始文件名)。

  3. 它作爲安全的,因爲你實現它。你目前的解決方案可能是安全的,我發佈的解決方案可能是安全的 - 但不知道細節,如何實現它,沒有人知道,如果它實際上是安全的。

+0

沒有,我實際上強迫用戶使用他上傳的相同擴展名下載,例如,如果用戶上傳的zip文件,我用fread讀取文本,然後將該文本保存在數據庫或文本文件中,然後如果用戶想要下載該文件,我只需創建文件並給予zip擴展名,然後強制用戶下載它,但一旦用戶上傳這個文件,然後如果用戶想打開它失敗,b ut它應該打開zip文件,因爲此文件的內容文本與用戶上傳到服務器的內容文本完全相同 – Alex

+0

而且您確定,您在編碼方面沒有問題,或者數據庫字段不小以保留所有內容? – Philipp

+0

即使爲了確保該文件包含與上傳版本相同的內容,我更改了實際文件的擴展名(將會上傳),然後複製文本並將其粘貼到下載的版本,然後更改兩個文件的extesion,真實文件工作,再次下載 – Alex

0
  1. 這是因爲您要打開二進制文件就像一個壓縮文件,它在一個文本文件存儲然後用zip擴展再次流了。

  2. 理想的解決辦法是給有記錄的,大的開發者社區使用100萬個開源的文件管理器中的一個在那裏。但如果由於某種原因想要構建自己的文件夾,請將文件保存在公用文件夾外的安全文件夾中。將路徑存儲在選擇的數據庫中,並將其顯示給用戶。根據請求使用公共路徑映射到私人路徑並自行開始下載。

  3. 當你做了,但沒有什麼是100%安全的,所以如果你存儲敏感數據使用的東西很好地建立和記錄是爲安全

+0

謝謝你的答案,是不可能讀取二進制文件的文本內容? – Alex

+0

這是一個二進制文件。當你用文本編輯器打開它時,你會看到編輯器對文件的解釋。您可以將它的內容保存爲純文本文件,但如果您遇到編碼問題,最有可能會破壞它。爲什麼不簡單地將blob對象存儲在數據庫中,或將文件存儲在文件系統中更安全的地方? –