これが予期される動作であるかどうかはわかりませんが、ImageFieldフィールドを持つ単一のモデルでプロジェクトを作成し、ファイル名「árvórés」で写真をアップロードすると、アップロードされたファイルは理解できないファイル名(ascii、私は推測します)。直接的な結果として、その写真をサイトから取得することは不可能になります。
これは正常ですか?はいの場合、これらのタイプのファイル名を許可するにはどうすればよいですか?
これが予期される動作であるかどうかはわかりませんが、ImageFieldフィールドを持つ単一のモデルでプロジェクトを作成し、ファイル名「árvórés」で写真をアップロードすると、アップロードされたファイルは理解できないファイル名(ascii、私は推測します)。直接的な結果として、その写真をサイトから取得することは不可能になります。
これは正常ですか?はいの場合、これらのタイプのファイル名を許可するにはどうすればよいですか?
問題は、ブラウザーが POST データをエンコードする方法を指定していないため、ブラウザーが使用する必要があると推測したもの (通常は Unicode (UTF-8) ではなく ISO-8859-1) を取得していることです。
FORM 要素の HTML 4.01 仕様には、「accept-charset」属性が含まれています。これにより、データを POST する際のエンコーディングを次のように指定できます。
accept-charset = charset リスト [CI]
この属性は、このフォームを処理するサーバーが受け入れる入力データの文字エンコーディングのリストを指定します。値は、スペースまたはカンマで区切られた文字セット値のリストです。クライアントは、このリストを排他的 OR リストとして解釈する必要があります。つまり、サーバーは、受信したエンティティごとに任意の 1 文字のエンコードを受け入れることができます。
この属性のデフォルト値は予約文字列「UNKNOWN」です。ユーザー エージェントは、この値を、この FORM 要素を含むドキュメントの送信に使用された文字エンコーディングとして解釈する場合があります。
つまり、UTF-8 でエンコードされたページを提供する場合、ブラウザはデフォルトで UTF-8 でリクエストを送信します。
最善の解決策は、応答ヘッダーに適切なエンコーディングを含めるか、HTML の HEAD セクション内に次のようなものを含めることによって、すべてのページの文字エンコーディングを指定することです。
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
HTML 4.01 仕様には、提供する文字エンコーディングを指定する方法に関するセクションがあります。
代替の、より簡単な修正方法は、文字エンコーディングをどこにも指定せず、代わりに、ブラウザが ISO-8859-1 のデフォルト エンコーディングで送信していると仮定して、ファイル名を手動でデコードすることです。
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
filename = form.cleaned_data.image.name.decode('iso-8859-1')
...