Ошибка "Операция ввода-вывода для закрытого файла" при попытке открыть загруженный файл 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