相关疑难解决方法(0)

将Django的FileField设置为现有文件

我在磁盘上有一个现有文件(例如/folder/file.txt)和Django中的FileField模型字段.

当我做

instance.field = File(file('/folder/file.txt'))
instance.save()
Run Code Online (Sandbox Code Playgroud)

它将文件重新保存为file_1.txt(下一次_2,等等).

我理解为什么,但我不想要这种行为 - 我知道我希望该字段与之关联的文件真的在那里等着我,我只想让Django指向它.

怎么样?

python django file

82
推荐指数
4
解决办法
3万
查看次数

Django上传:丢弃上传的重复项,使用现有文件(基于md5的检查)

我有一个模型FileField,其中包含用户上传的文件.由于我想节省空间,我想避免重复.

我想要实现的目标:

  1. 计算上传的文件md5校验和
  2. 使用基于md5sum文件名存储文件
  3. 如果已存在具有该名称的文件(新文件重复),则丢弃上载的文件并使用现有文件

12已经可以使用了,但是如何忘记上传的副本并使用现有文件呢?

请注意,我想保留现有文件不是覆盖它(主要是为了保持修改时间相同 - 更好的备份).

笔记:

  • 我正在使用Django 1.5
  • 上传处理程序是 django.core.files.uploadhandler.TemporaryFileUploadHandler

码:

def media_file_name(instance, filename):
    h = instance.md5sum
    basename, ext = os.path.splitext(filename)
    return os.path.join('mediafiles', h[0:1], h[1:2], h + ext.lower())

class Media(models.Model):
    orig_file = models.FileField(upload_to=media_file_name)
    md5sum = models.CharField(max_length=36)
    ...

    def save(self, *args, **kwargs):
            if not self.pk:  # file is new
                md5 = hashlib.md5()
                for chunk in self.orig_file.chunks(): …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-file-upload

25
推荐指数
2
解决办法
1万
查看次数

标签 统计

django ×2

python ×2

django-file-upload ×1

django-models ×1

file ×1