web-dev-qa-db-ja.com

Djangoのフォルダにファイルを保存するだけです

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()
16
Jon

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)
17
Mesut Tasci

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')
9
bhawnesh dipu

Django FileFieldを使用できます。upload_toパラメータは、次のようになります。

data_file = models.FileField(upload_to=content_path)

どこ content_pathは、文字列または文字列を返す関数です。

7
WKPlus

次のコードを使用して、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
1
Tobias Ernst