2014-02-15 3 views
1

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

OSError at /admin/videos/video/add/ 
[Errno 2] No such file or directory 

Я не могу понять, почему я получаю эту ошибку, потому что файл находится там.

Вот модель:

class Video(models.Model): 
    file = models.FileField(upload_to='videos/videos') 
    screenlist = models.ImageField(upload_to='videos/screenlists', editable=False) 

    def save(self, force_insert=False, force_update=False, using=None, 
      update_fields=None): 
     if self.pk is None: 
      self.file.save(self.file.name, self.file, save=False) 
      screenlist_path = get_screenlist(self.file.path.encode('utf-8')) 
      self.screenlist = File(open(screenlist_path)) 

      video_info = get_video_info(self.file) 
      self.duration = get_duration(video_info) 
     super(Video, self).save(force_insert, force_update, using, update_fields) 

Вот строка в get_screenlist метод, при котором происходит исключение:

info = subprocess.check_output([ 
     'ffprobe', '-loglevel', 'error', '-show_format', 
     '-show_streams', path, '-print_format', 'json'], 
     stderr=subprocess.STDOUT 
    ) 
+0

Можете ли вы выяснить, что точный каталог не может быть найденный? Переменная пути? – sergzach

+0

Да, и когда я использую тот же путь для функции get_screenlist в оболочке django (не внутри метода сохранения), все работает нормально. –

+0

Вывести значение переменной пути. Вероятно, это неверно. – sergzach

ответ

0

1-ая возможная причина

Файл существует, но по-прежнему заблокирован родительский процесс, который создал файл или открыл его и имеет блокировку для этого файла (BTW вы используете subprocess.check_output()).

Вы должны освободить замок перед дальнейшими действиями с файлом.

2-ая возможная причина

Попробуйте изменить сохранить = False в сохранить = True в строке:

self.file.save(self.file.name, self.file, save=False) 
+0

'save = True' есть специально. Без этого эта вещь будет называть себя рекурсивно, и она никогда не перестанет загружать копии файла в медиа-каталог. Не могу сказать ничего о замке, я подумаю об этом, спасибо. –

+0

@DmitryMikhaylov В любом случае лучше вызвать внешнюю утилиту в отложенной задаче. Например, использование сельдерея. Я уверен, что у вас нет такой проблемы, если вы используете отложенные задачи для таких вещей. – sergzach

Смежные вопросы