【问题标题】:Simply save file to folder in Django只需将文件保存到 Django 中的文件夹
【发布时间】:2014-12-04 02:58:35
【问题描述】:

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

file = request.FILES['f']

将此文件保存到我的媒体文件夹中的最简单方法是什么

settings.MEDIA_ROOT

我正在查看 this answer 等,但我遇到了涉及未定义名称和无效“块”方法的错误。

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

编辑 在我的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()

【问题讨论】:

  • 是否可以将其保存在数据库中?您提到的发布的解决方案似乎是正确的。您可以发布错误消息吗?您是否阅读了答案的第二篇文章 - 它讲述了块错误以及如何修复它
  • 请查看我的编辑,我现在得到“未定义全局名称'ContentFile'”
  • 你可以在django.core.files图书馆找到它
  • answer的第二部分,别忘了从django.core.files导入ContentFile
  • 关于在数据库中保存文件的评论。不要这样做。文件属于文件系统,而不是数据库。您的数据库应该只记录文件的存储位置。

标签: python django django-models django-forms


【解决方案1】:

使用以下代码更新FileFieldImageField。默认情况下,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

网址如下:

self.model.file_field.url

【讨论】:

  • 如果我只需要简单地保存一个文件,而不愿意为此定义一个额外的Model 怎么办?
【解决方案2】:

使用default_storage 优于FileSystemStorage

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

如果您使用default_storage,将来如果您想使用 aws、azure 等作为具有多个 Django 工作人员的文件存储,您的代码将无需任何更改即可工作。

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)

【讨论】:

  • 想要补充一点,使用 'default_storage' 也有助于在环境之间保持代码相同,例如开发者的笔记本电脑开发环境和生产环境。
  • 我真的觉得这在 django 中搞砸了或者真的很难理解,因为有很多东西可以满足类似的需求,default_storageFileSystemStorageDEFAULT_FILE_STORAGE,真的吗?完全混淆了哪个是什么...
  • @avocado default_storage 是对存储后端的抽象,DEFAULT_FILE_STORAGE 用于指定默认情况下要使用的存储后端。 default_storage 使用此设置保存或读取文件。您可以使用FileSystemStorageAWS S3Azure Store 等作为存储后端。
  • 我们将如何使用这种方法保存到 defaultstorage 内的另一个文件夹中?
【解决方案3】:

您可以将文件上传到 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')

【讨论】:

    【解决方案4】:

    你可以使用djangoFileField,它支持指定upload_to参数,像这样:

    data_file = models.FileField(upload_to=content_path)
    

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

    【讨论】:

      猜你喜欢
      • 2012-08-31
      • 2013-01-29
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 2021-01-06
      • 1970-01-01
      相关资源
      最近更新 更多