代码:
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
一次只能处理一个文件?
如何处理文件并将其另存为两个或更多文件?
答案 0 :(得分:1)
正如@wiesion在对问题的评论中所说,您可以尝试使用data.seek(0)
重设缓冲区。
为什么?好吧,在您的代码中有这个
data = request.FILES['file']
data_50 = request.FILES['file']
表示data
和data_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)
也许您可以尝试使用此版本,并让我们知道它是否可以解决您的问题。