Django,保存图像,OSError:无法识别图像文件

时间:2018-06-23 11:11:08

标签: python django file

代码:

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'})

Traceback是这样的:

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>

说明:

您可以在上面的代码中看到,目的是保存请求的图像文件。

我试图找出发生了什么,哪一行有问题。因此print 2已打印,因此input_file_50 = BytesIO(data_50.read())行有问题。

问题:

为什么会发生此错误? BytesIO一次只能处理一个文件?

如何处理文件并将其另存为两个或更多文件?

1 个答案:

答案 0 :(得分:1)

正如@wiesion在对问题的评论中所说,您可以尝试使用data.seek(0)重设缓冲区。

为什么?好吧,在您的代码中有这个

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

表示datadata_50将指向同一文件。调用data.read()时,将读取内容,并且当前位置位于文件末尾。

以后再调用data_50.read()时,当前位置已经在末尾(因为它与data相同),没有更多内容可供读取,因此调用{{ 1}}不返回任何内容。因此,没有要保存的图像。

通过调用read()(或data.seek(0)data_50.seek(0)),您正在告诉该文件将当前位置再次放置在文件的开头,以便下次调用{{ 1}}可以再次输出整个文件内容。

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)

也许您可以尝试使用此版本,并让我们知道它是否可以解决您的问题。