2014年3月2日 星期日

PHP : smbwebclient.php 增強之二

2014年3月2日 星期日
延續去年底的 smbwebclient.php 增強版,陸續改善及增加了以下幾個地方:

  • 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
前者是總資料大小,後者則是檔案數的限制。




程式下載



相關文章





2 則留言:

  1. What a nice feature! Good job!

    回覆刪除
  2. 很棒的文章。 添加的一件事,是對以base64編碼的數據部分進行解碼。 您也可以參考該工具
    url-decode.com/tool/base64-decode
    作為備選。 這也提供對許多其他重要Web實用程序的訪問。

    回覆刪除

 
雄::gsyan © 2009. Design by Pocket