Ошибка "Операция ввода-вывода для закрытого файла" при попытке открыть загруженный файл django 1.8

Не удается открыть загруженный файл при использовании Django1.8, я сталкиваюсь с ошибкой "ValueError: операция ввода-вывода для закрытого файла". Но это хорошо работает в Django 1.6:

Django1.8
>>>type(in_file)
<class 'django.core.files.uploadedfile.TemporaryUploadedFile'>
>>>in_file.closed
True

Django1.6
>>>type(in_file)
<class 'django.core.files.uploadedfile.TemporaryUploadedFile'>
>>>in_file.closed
False

def save_to_file(in_file, dest_file, type='w'):
    try:
        with open(dest_file, type) as out_file:
            for line in in_file:
                out_file.write(line)
    except Exception as e:
        print "Error::--{}".format(e)
>>>save_to_file(in_file, '/Work/YYY.FLAT')
Error::--I/O operation on closed file

1 ответ

Подобная ошибка сообщается на форуме openstack вместе с исправлением. См. Пост здесь и исправить здесь. Ваш код может выглядеть так:

def mark_inmemory_file_close(myfile):
    if myfile:
        # There is a bug in Django 1.7, which causes InMemoryUploadedFile to close automatically. The new thread
        # always has a closed file to read.
        # Fix - https://git.openstack.org/cgit/openstack/horizon/commit/?id=78e9a997e4c6faf393d3bdaa3a043f1796aaa1bd
        if isinstance(myfile, TemporaryUploadedFile):
            # Hack to fool Django 7 and above, so we can keep file open in the new thread.
            myfile.file.close_called = True
        if isinstance(myfile, InMemoryUploadedFile):
            # Clone a new file for InMemeoryUploadedFile.
            # Because the old one will be closed by Django.
            myfile = SimpleUploadedFile(myfile.name,
                                              myfile.read(),
                                              myfile.content_type)
        return myfile
    return None                                        
Другие вопросы по тегам