黑客攻击django-stdimage2以支持多个图像

时间:2011-08-09 19:19:21

标签: django image

我正在开发一个Django项目,允许用户一次上传多个图像。除非你有更好的建议,否则项目的这一部分可能会由SWFUpload处理。

图像重命名,调整大小和创建缩略图将由django-stdimage2处理。

问题
django-stdimage2使用字段名称和对象主键重命名每个图像。 如果带有主键1的齿轮行存在五个图像,则所有五个图像将重命名为“image_1.jpeg”。

在我介绍可能的解决方案之前,这是我的模型。 基本上,一个齿轮排可以有许多gear_image行。

class gear(models.Model):
       id = models.AutoField(primary_key=True)
       model = models.CharField(max_length=100)

class gear_images(models.Model):
       id = models.AutoField(primary_key=True)
       gear_id = models.ForeignKey(gear)
       image = StdImageField(upload_to='images/gear', blank=True, size=(640, 480, True), thumbnail_size=(100, 100, True))

解决方案
我想在文件名中添加时间戳(以毫秒为单位)并四舍五入。 我既不是Python也不是Django pro,但是我在django-stdimage2的fields.py文件中搜索过,我想我找到了我需要编辑的代码才能使其工作。 注释掉的两行代码是我提出的解决方案:

def _rename_resize_image(self, instance=None, **kwargs):
    '''
    Renames the image, and calls methods to resize and create the thumbnail
    '''
    if not kwargs.get('raw', None):
        if getattr(instance, self.name):
            filename = getattr(instance, self.name).path
            ext = os.path.splitext(filename)[1].lower().replace('jpg', 'jpeg')
            # time_stamp = int(round(time.time() * 1000))
            # dst = self.generate_filename(instance, '%s_%s_%s%s' % (self.name, instance._get_pk_val(), time_stamp, ext))
            dst = self.generate_filename(instance, '%s_%s%s' % (self.name, instance._get_pk_val(), ext))
            dst_fullpath = os.path.join(settings.MEDIA_ROOT, dst)
            if os.path.normcase(os.path.abspath(filename)) != os.path.normcase(os.path.abspath(dst_fullpath)):
                os.rename(filename, dst_fullpath)
                if self.size:
                    self._resize_image(dst_fullpath, self.size)
                if self.thumbnail_size:
                    thumbnail_filename = self._get_thumbnail_filename(dst_fullpath)
                    shutil.copyfile(dst_fullpath, thumbnail_filename)
                    self._resize_image(thumbnail_filename, self.thumbnail_size)
                setattr(instance, self.attname, dst)
                instance.save()

每个图像名称如下所示:image_1_159753456.jpeg
你认为这是一个很好的解决方案吗?我也对其他想法持开放态度。

谢谢:)

1 个答案:

答案 0 :(得分:0)

我认为你根本没有问题。

django-stdimage {2}将重命名为gear_images模型的对象ID,而不是其父齿轮模型。因此,一个齿轮可以有许多图像,每个齿轮都会将gear_images pk附加到文件名中。

实际上,如果您在文件名中使用齿轮模型的pk而不是gear_images pk,那么您只会遇到问题。如果你对后者没问题,那么你不需要做任何事情,它应该可以正常工作。