只需将文件保存到Djang中的文件夹

2024-03-29 13:33:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码,可以通过POST从表单中获取文件。

file = request.FILES['f']

将此文件保存到

settings.MEDIA_ROOT

我在查看this answer等等,但是我在引用未定义的名称和无效的“chunks”方法时出错。

一定有一个简单的方法可以做到这一点吗?

编辑 my 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()

Tags: thepath方法settingsosrequestrootfiles
3条回答

使用default_storage比使用FileSystemStorage要好。

您可以使用FileSystemStorage将文件保存到MEDIA_ROOT中,但将来更改DEFAULT_FILE_STORAGE后端时,这可能不再工作。

如果你使用default_storage,将来如果你想使用aws、azure等作为多个Django工作者的文件存储,你的代码将不会有任何改变。

默认存储使用示例:

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)

您可以使用djangoFileField,它支持指定一个upload_to参数,如下所示:

data_file = models.FileField(upload_to=content_path)

其中content_path可以是字符串或返回字符串的函数。

您可以将文件上载到django服务器:

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')

相关问题 更多 >