centOSとApacheで構成しているサーバー環境で、Djangoで日本語ファイル(画像)をアップロードしようとすると、エラーが出力されてしまいました。
ちょっと苦戦したので、今回記事にしました。
【 エラー内容 】
エラー内容は、
‘ascii’ codec can’t encode characters in position
こんな感じ。
エラー見ただけでもわかりますが、encodeできないという内容みたい。もちろん、ローカルだと問題なく動いている。日本語のファイルのアップロードも問題ない。じゃあ、これをどうすればいいのかっていうのを調べてみた。
・Fixing UnicodeEncodeError for file uploads
https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/modwsgi/
Djangoの公式サイトにも記載されている通り、こういった文字コードの設定が必要ということ。
加えて、
・mod_wsgiで動かす時に、UnicodeDecodeErrorが出てしまう
https://qiita.com/kanjirz50/items/81104b60049ad7140b30
こちらの記事も参考にさせていただいた。
【 自分の環境だとどうするか 】
今回は、Apacheの設定環境などは特段難しいことはしていない。
でも、単純に参考サイトのように設定してもうまくいかなかった。
そこで、
LANG = 'ja_JP.UTF-8' LC_ALL='ja_JP.UTF-8'
を設定した。これを設定する時のファイルは、[ /etc/sysconfig/httpd ]
これをvimで開いて上記の設定を行った。
【 所感 】
このDjangoでの日本語ファイルのアップロードに関しては実はこれまでも悩まされていたところだった。フロント側のjsで日本語から英語へとファイル名を変更する方法も視野に入れて検討していたがスマートではないので、なんとかサーバー側にあげるときに日本語ファイルもアップロードさせたかった。
もし、同じ悩みを抱えている人がいるのであれば、上記の方法を試してみて欲しい。
【 追記 】
上記の内容からは若干それてしまうが、mediaをアップロードする先のディレクトリの権限も変更しておかなければならなかったので、併せて追記。
どのサーバーに設置するのかという点も併せてそれぞれの環境で違うとは思いますが、今回使用しているさくらVPSだと、mediaをアップロードする先のディレクトリの権限を変更しておかないといけなかった(GCPとかだとそもそもバケット側に保存するので不要か???)ので、この対応をして、きちんと日本語ファイルのアップロードができるようになりました。
めでたしめでたし。