2014年8月12日 星期二

php 中文檔名上傳問題

使用 php 的檔案上傳,英文檔名都沒有問題,然而遇到中文檔名,就不行了!

Google了一下網路上相關文章很多,不外乎:

1. 用 iconv() 轉碼
2. 用 mb_convert_encoding() 轉碼

這兩個方法,我都試了,都是失敗的!為什麼呢?

還在找答案。

另外一個方法是,不管中文檔名了,上傳時將中文檔名,改成一個英數字的檔名,並且將原始中文檔名記錄到資料庫中,然後以改過的英數字檔名上傳。
顯示出來的上傳檔案列表資訊就抓資料庫中的原始名稱,而連結就連結到英數字的檔名。
這樣,大概就能解決中文檔名的問題了。



https://gist.github.com/AyoiS/7178911

解決檔案上傳時,PHP的basename函數不支援中文的方法
<?php
//php自帶的basename函數不支持中文,下面這個方法是最簡單的實現。
function get_basename($filename){
return preg_replace('/^.+[\\\\\\/]/', '', $filename);
}
  • preg_replace('/^.+[\\\\\\/]/', '', $FileName)
某些中文字可以,"山水"可以,但是其他的還是失敗了!

閱讀到網站上某網友的意見:好像這樣是比較好的解決方案了。

"我認為不太需要花時間在處理「中文」這件事情上了。
基本上我檔案上傳後,「中文」名稱是直接存進資料庫。
然後將上傳的檔案用另外的規則重新編檔(我是用日期時間+tmp_name再用md5壓成主檔名)
當然副檔名還是保留原來的。
下載的時候才從資料庫將中文檔名取出來「裝回去」。
使用者下載回來的還是正常的中文檔名檔案。"


-------------------------------
* 註:2020/10/28/12:44,又遇到中文檔案要上傳的問題,查了資料、使用 CCS 試了,修改 CCS 裡面的 Classes.php、還有主檔案的 record 資料庫 新增時,分別轉換  iconv()。以上另外紀錄。

參考:http://blog.e-happy.com.tw/php-move_uploaded_file-to-upload-documents-in-the-name-of/

PHP上傳中文檔案發生錯誤的原因在於中文版的伺服器若是使用 Big5 在編碼,而由網頁送過來資料卻是以 UTF8 來編碼,如此一來在接收時就會產生編碼的錯失,導致檔案上傳的失敗。我們建議您修改的方式,就是將接收到的檔名,由 UTF8 轉為 Big5 的編碼,最後再儲存即可。

move_uploaded_file($_FILES['fileField']['tmp_name'],
iconv("UTF-8", "big5", $target_path )

沒有留言:

張貼留言

如何判斷現在FORM是在 insert mode? 還是 update mode?

只要用  if (empty({primary_key})) 就可以知道是否為新增模式了。 如果 {promary_key} 是空白的,那麼就是在新增模式;反之,就是更新模式。 以上。