POSTを介してフォームからファイルを取得するコードがあります。
file = request.FILES['f']
このファイルを私のメディアフォルダに保存する最も簡単な方法は何でしょうか
settings.MEDIA_ROOT
とりわけ この答え を見ていましたが、未定義の名前と無効な「チャンク」メソッドを参照するエラーがありました。
これを行う簡単な方法があるはずですか?
[〜#〜] edit [〜#〜]views.pyのアップロード方法:
def upload(request):
folder = request.path.replace("/", "_")
uploaded_filename = request.FILES['f'].name
# create the folder if it doesn't exist.
try:
os.mkdir(os.path.join(settings.MEDIA_ROOT, folder))
except:
pass
# save the uploaded file inside that folder.
full_filename = os.path.join(settings.MEDIA_ROOT, folder, uploaded_filename)
fout = open(full_filename, 'wb+')
file_content = ContentFile( request.FILES['f'].read() )
# Iterate through the chunks.
for chunk in file_content.chunks():
fout.write(chunk)
fout.close()
default_storage
の使用はFileSystemStorage
よりも優れています。
FileSystemStorage
を使用してファイルをMEDIA_ROOT
に保存できますが、DEFAULT_FILE_STORAGE
バックエンドを将来変更すると、これが機能しなくなる可能性があります。
default_storage
を使用する場合、将来、aws、Azureなどを複数のDjango workerを使用するファイルストアとして使用する場合は、コードは変更なしで機能します。
default_storageの使用例:
from Django.core.files.storage import default_storage
# Saving POST'ed file to storage
file = request.FILES['myfile']
file_name = default_storage.save(file.name, file)
# Reading file from storage
file = default_storage.open(file_name)
file_url = default_storage.url(file_name)
Django server::
from Django.shortcuts import render
from Django.conf import settings
from Django.core.files.storage import FileSystemStorage
def upload(request):
folder='my_folder/'
if request.method == 'POST' and request.FILES['myfile']:
myfile = request.FILES['myfile']
fs = FileSystemStorage(location=folder) #defaults to MEDIA_ROOT
filename = fs.save(myfile.name, myfile)
file_url = fs.url(filename)
return render(request, 'upload.html', {
'file_url': file_url
})
else:
return render(request, 'upload.html')
Django FileField
を使用できます。upload_to
パラメータは、次のようになります。
data_file = models.FileField(upload_to=content_path)
どこ content_path
は、文字列または文字列を返す関数です。
次のコードを使用して、FileField
またはImageField
を更新します。 Djangoは、デフォルトでファイルをsettings.MEDIA_ROOT
にアップロードします。
from os.path import basename
from Django.core.files import File
self.model.file_field.save(basename(path), content=File(open(path, 'rb')))
あなたがアクセスできるあとがき:
このようなパス:
self.model.file_field.path
このようなURL:
self.model.file_field.url