【问题标题】:How to save an image to FileField from its path?如何将图像从其路径保存到 FileField?
【发布时间】:2017-12-09 15:01:04
【问题描述】:

我有一个 图像 存储在我的 media/logo/ 文件夹中,我想从我的角度将其保存到我的模型的 FileField。这是我尝试过的,但出现编码错误,并且在我尝试保存文件后文件已损坏。

UnicodeDecodeError: 'charmap' 编解码器无法解码字节...


views.py:

def save_records(request):
    new_path = os.path.join(settings.MEDIA_ROOT, 'logo', filename)
    same_file = File(new_path, filename)
    Company.objects.create(logo=same_file)

我在理解如何将new_path 中的文件保存到 FileField 时遇到了一些麻烦,知道吗?

【问题讨论】:

    标签: python django file django-views


    【解决方案1】:

    如果您希望 FileField 使用现有文件而不是创建新文件。

    def save_records(request):
        c = Company()
        c.logo.name = 'logo/<filename>'  #relative to the media root.
        c.save()
    

    而且,如果你想修改现有记录的文件名

    old_path = c.logo.path
    c.logo.name = 'logo/<new filename>'  #relative to the media root.
    new_path = settings.MEDIA_ROOT + c.logo.name
    os.rename(old_path, new_path)
    c.save()
    

    如果要将内容复制到新文件,请使用@Roman Miroshnychenko 的解决方案。

    Django 的 FileField 在内部使用FileSystemStorage 来存储和管理文件,因此您可以覆盖它的行为。这将确保 Django 始终使用提供的文件名,而不是生成新的。

    from django.core.files.storage import FileSystemStorage
    
    class CustomFileStorage(FileSystemStorage):
    
        def get_available_name(self, name):
            return name # returns the same name
    

    在你的模型中

    from app.storage import CustomFileStorage
    
    fs = CustomFileStorage()
    
    class Company(models.Model):
       logo = model.FileField(storage=fs)
    

    【讨论】:

      【解决方案2】:

      根据the docs File 类需要一个文件对象作为第一个参数,而不是路径字符串。你需要做的:

      with open(new_path, 'rb') as fo:
          same_file = File(fo, filename)
          Company.objects.create(logo=same_file)
      

      【讨论】:

      • 问题是该文件已经存在并且django正在保存一个新文件而不是使用现有文件,有没有办法不创建新文件并使用已经存在的文件?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2018-07-05
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多