2008年6月24日 星期二

撰寫上傳物件的問題

想要寫一個檔案上傳的物件,以方便以後程式碼的重複使用,不必重造輪子,做相同的事情,仔細思考很久,如果上傳的檔案都存在目錄裡,還必須考量到檔案備份、程式碼中檔案上傳的安全性,使用者上傳的檔案名稱也必須做管控,才能避免檔案重複,造成檔案彼此覆蓋的問題,因此決定將上傳物件,寫成將插入資料庫的型式,如果以物件導向的模式方式思考,其實應該實做一個interface或abstract,再分別撰寫要上傳至資料庫的物件,及上傳至目錄的物件,這樣才能顧及程式的擴展性及可維護性,不過現在沒想那麼多,先能用就好了。

檔案存到資料庫中,只要必份資料庫並小心權限設定,程式碼使用prepared statement操控資料庫,就可以避掉sql injection及檔案備份的問題,以後只要備份資料庫就可以了,而不用再備份檔案,也不用再花心思控管上傳檔案的安全性。比較省事。

上傳物件,在網路上有許多現成的程式碼可以參考,各種寫法看了讓人頭昏眼花,參考了php manual後,最後決定使用file_get_contents函數進行檔案的處理,這個函數是php manual上建議使用的函數,雖然php 6.0以後才會完整支援所有的參數,但轉換檔案為string時,這個函數的轉換效率是最好的。

如果使用fopen開啟檔案,再使用read()函數進行讀取,要記得加上參數'rb',如fopen(檔案,'rb'),因為windows系統對待binary跟文字檔是不同的,所以要記得加b,操作時才不會出錯。

測試上傳物件時,檔案比較大的物件上傳時,都會被切成只有64k,找程式碼找了半天,也找不到錯誤,後來,在mysql manual上找到原因了,blob的儲存上限是64k,mediumblob是16M,bigblob是4g,改欄位的資料型態就一切正常了。

另一個在測試時碰到的問題,就是中文檔名下載時會出會錯誤,只要使用urlencode()函數將檔名重新編碼,就不會有這個問題了。

沒有留言: