LINUX.ORG.RU

Проверить существование файла в django

 


0

1

Пользователь загружает файл. Нужно проверить, нет ли у какого-либо экземпляра этой модели такого же файла. Имена файлов могут быть разные, проверять надо по контенту. Такое вообще возможно?

★★★★★

для проверки по контенту существуют всевозможные sum: md5sum sha1sum etc. берешь побольше и вперед

redixin ★★★★
()

а как будешь потом разруливать удаление файла в одном экземпляре? удалять оба экземпляра, или оставлять один битым?

fMad ★★
()
Ответ на: комментарий от fMad

В смысле битым? Если такой файл уже есть, я просто выведу в форму сообщение «такой файл уже заливали, дайте другой».

vurdalak ★★★★★
() автор топика
Ответ на: комментарий от vurdalak

я то о другом, предполагая, что раз пользователь залил файл, тот который он и хотел залить, но который уже есть на сервере, то просто, молча ставится на него ссылка

но при удаление этого, связанно с другим объектом файла, появляется битый объект

fMad ★★
()
Последнее исправление: fMad (всего исправлений: 1)
Ответ на: комментарий от fMad

Нет, там не ссылка ставится. Это имиджборда, у нее есть картинки. Обычно, если такую картинку уже заливали, пишут «есть уже такая, низзя». На нее не ставят ссылки, она просто где-то есть.

В принципе можно дедупликацию запилить, но мне лень заморачиваться.

vurdalak ★★★★★
() автор топика

Что-то я запутался. Я хочу переименовывать файл в его хэш, чтобы потом смотреть наличие такого файла. Но не понимаю, где мне получить хэш для записи его в имя. В методе для upload_to поля я не могу получить доступ к файлу. Из кастомного uploader'а я не могу передать хэш в upload_to или переименовать файл на лету (или могу?). Короче, я в непонятках, куда мне этот хэш сохранить.

vurdalak ★★★★★
() автор топика
Ответ на: комментарий от vurdalak

а добавить поле и индекс, типа md5

чтобы считать один раз, при аплоаде и заносить вместе с объектом, если такого md5 ещё нет в базе

fMad ★★
()
Ответ на: комментарий от vurdalak

file = models.FileField(upload_to=upload_path_handler, verbose_name=u'файл')

я так понимаю, что в момент вызова upload_path_handler можно подсчитать md5summ, обновив поле

остальное django должно сделать сама

fMad ★★
()
Ответ на: комментарий от fMad

Как я в этом хендлере посчитаю хэш файла (не имени, а именно файла)? Ведь этот метод получает только ImageField и оригинальное имя файла.

vurdalak ★★★★★
() автор топика
Ответ на: комментарий от vurdalak

я так понял что обрабатывая форму можно сгенерировать объект

form = UploadFileForm(request.POST, request.FILES)

обработать поле UploadedFile.temporary_file_path, это путь к временному файлу

а затем продолжить обработку объекта, сохранение

if form.is_valid():
   form.save()
fMad ★★
()
Ответ на: комментарий от vurdalak

дак, дочитай

вроде просто всё

class Media(models.Model):
    # use the custom storage class fo the FileField
    orig_file = models.FileField(
        upload_to=media_file_name, )
    md5sum = models.CharField(max_length=36)
    ...
# переопределяешь сохранение, в котором и подсчитываешь md5
    def save(self, *args, **kwargs):
            if not self.pk:  # file is new
                md5 = hashlib.md5()
                for chunk in self.orig_file.chunks():
                    md5.update(chunk)
                self.md5sum = md5.hexdigest()
            super(Media, self).save(*args, **kwargs)

fMad ★★
()
Последнее исправление: fMad (всего исправлений: 1)
Ответ на: комментарий от trashymichael

При чём тут обход? Это чисто для удобства. Один товарищ очень давно это просил, чтобы не путаться и не повторять уже загруженные картинки.

vurdalak ★★★★★
() автор топика
Последнее исправление: vurdalak (всего исправлений: 1)
Ответ на: комментарий от vurdalak

Ты вообще бордами пользовался? Я хочу залить картинку, и тут бабах, такая картинка уже есть, на соседней борде, на 4й странце треда «азаза», все уже конечно ее видели и она тут не в тему, это говорит твой супер-хеш, а может картинку не снесли, поста нет а хештест позитивный...

trashymichael ★★★
()
Ответ на: комментарий от vurdalak

Послушай, я не учу тебя жизни, все мы делаем как знаем и соседнее мнение мало влияет на процесс. Но нет никакого криминала в споре, вот у тебя такая позиция, тебе хочется эту «фичу», я советую тебе воздержаться, так мы и беседуем...

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

Ещё раз. У меня на борде не так много юзеров. Один из них давно просил эту фичу. Я решил, что она имеет смысл, так как он часто постит именно картинки и ему хотелось бы узнавать, когда они повторяются, чтобы не было дубликатов. Если будет объективная причина этого не делать, я эту фичу изменю или выпилю.

Я хочу залить картинку, и тут бабах, такая картинка уже есть, на соседней борде, на 4й странце треда «азаза», все уже конечно ее видели и она тут не в тему, это говорит твой супер-хеш, а может картинку не снесли, поста нет а хештест позитивный...

Понимаю. Тут наверное уместно сделать дедупликацию, но для этого придётся довольно много рефакторить и отвязывать картинку с её атрибутами от поста в отдельную модель. Это будет, но нескоро, так как в результате все сломается и будет долго фикситься.

vurdalak ★★★★★
() автор топика
Ответ на: комментарий от vurdalak

понимаешь, точно это проверить можно только привязав хеш картинки к юзеру, что похерит всю анонимность, так что не вариант

а для маленьких уютных, вполне подходяший вариант, согласен. закроем тему.

trashymichael ★★★
()
Ответ на: комментарий от trashymichael

понимаешь, точно это проверить можно только привязав хеш картинки к юзеру

Зачем? Хеш привязан к картинке же. Или ты про вероятность совпадения?

vurdalak ★★★★★
() автор топика
Ответ на: комментарий от trashymichael

Не вижу логики. Ладно, всё равно это уже запилено и смысла выпиливать пока не вижу.

vurdalak ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.