djangoを使用して、アップロード時にサーバー上で一意のファイル名で写真の名前を変更する最良の方法は何ですか? それぞれの名前が 1 回だけ使用されるようにしたい。おそらくGUIDを使用して、これを行うことができるpinaxアプリはありますか?
7 に答える
Use uuid. To tie that into your model see Django documentation for FileField upload_to.
For example in your models.py define the following function:
import uuid
import os
def get_file_path(instance, filename):
ext = filename.split('.')[-1]
filename = "%s.%s" % (uuid.uuid4(), ext)
return os.path.join('uploads/logos', filename)
Then, when defining your FileField/ImageField, specify get_file_path
as the upload_to
value.
file = models.FileField(upload_to=get_file_path,
null=True,
blank=True,
verbose_name=_(u'Contact list'))
Django 1.6.6、1.5.9、および1.4.14より前では、このget_avaialable_name
関数はアンダースコアを追加することでファイルに自動的に一意の名前を付けていました。したがって、たとえば、あるファイル「test.jpg」を保存してから別のファイル「test.jpg」をサーバーに保存すると、最初のファイルはtest.jpgと呼ばれ、2番目のファイルはtest_1.jpgと呼ばれます。
悲しいかな、それはマシンをDDOSするためのベクトルであり、保存するために何千ものゼロバイトファイルを送信し、それぞれが何千もの以前のファイルをチェックしてその名前がどうあるべきかを確認します。
ドキュメントでわかるように、新しいシステムでは、この問題を修正するために、アンダースコアの後にランダムな7桁の数字が追加されます。
ファイル名を写真がアップロードされた日付/時刻と連結してから、 hashlibを使用してメッセージダイジェストを作成するのはどうですか?それはあなたにユニークなファイル名を与えるはずです。
または、一意のファイル名を作成する小さなスニペットを再利用して、そのファイルへのフルパスをハッシュ呼び出しへの入力として使用することもできます。それはあなたがあなたのファイルにマップすることができるあなたにユニークな一定の長さの文字列を与えます。