【PHP】日本語ファイルのアップロード処理

  • このエントリーをはてなブックマークに追加

基本的には問題なく処理できているはずのアップロード処理が、一部のファイルで不具合発生していたので、解決までの流れをメモしておきます。

解決策

以下の記述を取り急ぎ追加し、問題解消を確認しました。

  • mb_internal_encoding(“UTF-8”); を追加
  • setlocale(LC_CTYPE, ‘Japanese_Japan.932’);
  • basename() を別の処理に変更

発生した問題について

半角全角が混ざっているファイル名の場合(例:2020_ファイル名.zip)は問題なくアップロードできている。

ファイル名が以下の条件のファイルでアップロードが確認できない。

  • 墨カッコ(【】←これ)が先頭にある
  • ファイル名が日本語のみ

FTPでアップロード先ディレクトリを確認したところ、「.pdf」というファイルがアップロードされていることを確認。

上記ファイルを確認し、目的のファイルであることを確認。

同時にDBへファイルリストを登録しているが、こちらは正しく登録されていた。

原因について

情報を検索したところ、いくつかの解決策を発見できました。

mb_internal_encodingを指定する

なんで指定してなかったんでしょうね……orz

とりあえずこれだけでは解決しませんでしたが、削除した場合の検証をする(精神的)余裕がないので残しておきました。

setlocaleを指定する

逆に問題発生の原因にもなりえるようですが、とりあえず記述しておきました。

削除した場合の(略)

basenameの処理を別処理に置換

basenameの部分を以下の処理に変更しました。

end(explode("/", $_FILES['attach']['name']))

取得したファイル名を「/」で分割し、生成された配列の最後=ファイル名を取得しています。

とりあえず上記の対策で問題解決しました。
文字コード設定忘れはちょっと情けないですが…

basenameのバグ、解消している説は嘘だったのでしょうか…?

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*