Django, сохранение изображения, OSError: невозможно идентифицировать файл изображения - PullRequest
0 голосов
/ 23 июня 2018

КОД:

if request.is_ajax():
    testpic = TestPic.objects.get(pk=1)

    form = TestPicForm(request.POST, request.FILES)
    if form.is_valid():
        from PIL import Image
        from io import BytesIO

        data = request.FILES['file']
        data_50 = request.FILES['file']

        input_file = BytesIO(data.read())
        image_crop = Image.open(input_file)
        print('print 2')

        # Problem starts.
        input_file_50 = BytesIO(data_50.read())
        image_crop_50 = Image.open(input_file_50)
        image_crop = image_crop.crop((1,1,100,100))
        image_crop_50 = image_crop_50.crop((40, 40, 140, 140))
        image_resize = image_crop.resize((300, 300), Image.ANTIALIAS)
        image_resize_50 = image_crop_50.resize((50, 50), Image.ANTIALIAS)

        image_file = BytesIO()
        image_resize.save(image_file, 'JPEG')

        image_file_50 = BytesIO()
        image_resize_50.save(image_file_50, 'JPEG')

        data.file = image_file
        testpic.file = data

        data_50.file = image_file_50
        testpic.file_50 = data_50

        testpic.save()
        return JsonResponse({'success': 'file_uploaded'})

    return JsonResponse({'success': 'failed'})

И трассировка выглядит так:

print 2
Traceback (most recent call last):
... I remove some lines ...
  File "D:\pythonDev\project\upward\chatkaboo\authapp\views.py", line 844, in crop
    image_crop_50 = Image.open(input_file_50)
  File "D:\pythonDev\interpreters\forMultichat\lib\site-packages\PIL\Image.py", line 2590, in open
    % (filename if filename else fp))
OSError: cannot identify image file <_io.BytesIO object at 0x0000024B40510BF8>

Описание:

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

Я попытался выяснить, что произошло и в какой строке возникла проблема.Итак, print 2 было напечатано, и поэтому в строке input_file_50 = BytesIO(data_50.read()) возникли проблемы.

Вопрос:

Почему произошла эта ошибка?BytesIO может иметь дело только с одним файлом за раз?

Как я могу обработать файл и сохранить его как два или более файлов?

1 Ответ

0 голосов
/ 23 июня 2018

Как сказал @wiesion в комментарии к вопросу, вы можете попытаться сбросить буфер с помощью data.seek(0).

Почему?Ну, в вашем коде у вас есть это

data = request.FILES['file']
data_50 = request.FILES['file']

, означающее, что data и data_50 будут указывать на один и тот же файл.Когда вы вызываете data.read(), содержимое читается, и текущая позиция остается в конце файла.

Когда вы позже вызываете data_50.read(), текущая позиция уже находится в конце (потому что она такая жефайл как data), и больше нет содержимого для чтения, поэтому вызов read() не возвращает содержимого.Таким образом, изображение не будет сохранено.

Вызывая data.seek(0) (или data_50.seek(0) или request.FILES['file'].seek(0)), вы говорите этому файлу снова поместить текущую позицию в начало файла, чтобыследующий вызов read() может снова вывести весь файл.

input_file = BytesIO(data.read())
image_crop = Image.open(input_file)
print('print 2')

# ADD THIS LINE TO YOUR CODE
# it modifies the 'data' object, which is the same as 'data_50'
data.seek(0)

# Problem starts.
input_file_50 = BytesIO(data_50.read())
image_crop_50 = Image.open(input_file_50)

Другой способ, которым вы можете попробовать (без вызова .seek(0)), - передать результат .read() в переменную:

file_content = request.FILES['file'].read()
input_file = BytesIO(file_content)
input_file_50 = BytesIO(file_content)

image_crop = Image.open(input_file)
image_crop_50 = Image.open(input_file_50)

Может быть, вы могли быпопробуйте эту версию и дайте нам знать, если она решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...