- smbwebclient.php 操作畫面中的字太小了。
- smbwebclient.php 的「New File(Upload)」,一次只能上載一個檔案。
- smbwebclient.php 的「New File(Upload)」,無法使用 Drag & Drop 的方式選檔案。
- 利用 smbclient 傳遞資料給 SMB 主機時(使用指令 put)並不會保留檔案的 timestamp,也就是檔案的修改日期、時間會變成上載的時間,而非檔案原有的時間。
關於操作畫面中的字太小比較好解決,深深佩服 smbwebclient.php 作者的功力,他在一個 PHP 檔案中,除了 PHP 程式以外,還內嵌了網頁樣版、多國語系及所需要的圖示......。內嵌的元件部份都是以 Base64 編碼過後,儲存在 PHP 的變數中。因此,關於字太小的問題,只要找到輸出網頁 template 中的 CSS,將字型大小變大一些即可解決。
在 smbwebclient.php 中有個陣列變數「$inlineFiles」,其中的「style/page.thtml」有控制字型大小的 CSS,我利用 http://www.base64decode.org/ 的線上解碼、編碼功能,將 CSS 改好後,置換原來的變數內容即完成任務一。
一次上載多個檔案的問題,我將原來程式中 HTML input file 改為陣列的命名方式,變成「file[]」,另外,加了「multiple」的參數,這樣一來,使用者就可以一次選擇多個檔案。而 PHP 接收檔案的部份當然配合接收多檔的方式,以 for 迴圈加陣列來處理各個上載的檔案,再一一透過 smbclient 傳遞給檔案伺服器。
以 Drag & Drop 方式選取檔案的部份是利用 HTML5 的「handleFileSelect」事件,當使用者將要上載的檔案拖曳到「選擇檔案」的元件上時,將選好的檔名、大小及時間資訊取出,並顯示在畫面中。
點選上載的功能 |
拖曳要上載的檔案 |
選好檔案,按「OK」即可上載 |
關於檔案保留原始的時間戳記的問題,如果還是要使用 smbclient 的「put」指令是無解的,倒是之前在研究以 tar 方式上載資料 (smbclient -Tx 選項) 時,有注意它提到可以保留時間戳記。因此,一開始,我很天才的想了一個自認為是妙招的方法:先在暫存區開一個資料夾,將使用者上載的檔案先更名為原始的檔案 (PHP 中的「move_uploaded_file」),取出預先在使用點選檔案時保留的時間資訊,並以 PHP 的「touch」來還原檔案時間,將整個資料夾內的所有檔案以 tar 來打包,最後再以 tar 的方式餵給 smbclient (-Tqx 參數)。這樣子,不但解決檔案時間被抹掉,上載多檔時,smbclient 也不用呼叫多次。不過,此方法在檔名無中文的情形下,相當不錯,一遇到中文就「走精」了。研究了兩、三天,仍舊解決不了 unix like tar 先天無法保留正確中文資訊的問題。多個帶中文檔名的檔案打包後,只會正常解出一個給檔案伺服器。所以目前採用的是比較耗系統資源的方式,一次只用 tar 打包一個檔案,打包後交由 smbclient 以「-Tqx」選項還原到檔案伺服器。
在測試一次上載多個檔案的過程中才發現,PHP 中除了有一次最多可上載的資料量大小限制外,它也有一次最多可以上載幾個檔案的限制,為了檔案數限制的問題,害我又在 tar 及 smbclient 上兜了好大的圈子,因此,PHP 的設定檔「php.ini」記得要修改底下兩個參數內容:
- post_max_size
- max_file_uploads
前者是總資料大小,後者則是檔案數的限制。
程式下載
- 增強過的 smbwebclient.php 2.9 : smbwebclient.zip ( 2014.03.01 )
相關文章
What a nice feature! Good job!
回覆刪除很棒的文章。 添加的一件事,是對以base64編碼的數據部分進行解碼。 您也可以參考該工具
回覆刪除url-decode.com/tool/base64-decode
作為備選。 這也提供對許多其他重要Web實用程序的訪問。