为什么在 PIL(low) 中读取图像会破坏 Flask 图像终点?
Why does reading in an image in PIL(low) break Flask image end point?
我正在使用 Python Flask framework 建立网站。由于我将上传的图像存储在 MongoDB 中,我构建了一个简单的端点来通过 id:
提供图像
@app.route('/doc/<docId>')
def getDoc(docId):
userDoc = UserDocument.objects(id=docId).first()
if not userDoc:
return abort(404)
return Response(userDoc.file_.read(), mimetype=userDoc.file_.content_type)
这非常有效。但由于图像通常非常大,我现在还希望能够提供原始图像的缩略图。所以使用 Pillow 我想调整图像的大小,store/cache 它们在 /tmp
中并在需要时提供它们。所以我从这个开始:
@app.route('/doc/<docId>')
def getDoc(docId):
userDoc = UserDocument.objects(id=docId).first()
if not userDoc:
return abort(404)
desiredWidthStr = request.args.get('width')
desiredHeightStr = request.args.get('height')
if desiredWidthStr or desiredHeightStr:
print 'THUMBNAIL'
# Load the image in Pillow
im = Image.open(userDoc.file_) # <=== THE PROBLEM!!!
# TODO: resize and save the image in /tmp
print 'NORMAL'
return Response(userDoc.file_.read(), mimetype=userDoc.file_.content_type)
当我现在注释掉有问题的行并打开首页(其中加载了几张图片)时,所有图片都加载正常并且我看到了这个(如预期的那样):
THUMBNAIL
NORMAL
THUMBNAIL
NORMAL
THUMBNAIL
NORMAL
212.xx.xx.xx - - [2015-03-19 16:57:02] "GET /doc/54e74956724b5907786e9918?width=100 HTTP/1.1" 200 139588 0.744827
212.xx.xx.xx - - [2015-03-19 16:57:03] "GET /doc/54e7495c724b5907786e991b?width=100 HTTP/1.1" 200 189494 1.179268
212.xx.xx.xx - - [2015-03-19 16:57:03] "GET /doc/5500c5d1724b595cf71b4d49?width=100 HTTP/1.1" 200 264593 1.416928
但是当我 运行 我粘贴上面的代码时(问题行没有注释)图像没有加载,我在终端看到这个:
THUMBNAIL
THUMBNAIL
THUMBNAIL
NORMAL
NORMAL
NORMAL
212.xx.xx.xx - - [2015-03-19 16:58:11] "GET /doc/54e74956724b5907786e9918?width=100 HTTP/1.1" 200 138965 0.657734
212.xx.xx.xx - - [2015-03-19 16:58:11] "GET /doc/54e7495c724b5907786e991b?width=100 HTTP/1.1" 200 188871 0.753112
212.xx.xx.xx - - [2015-03-19 16:58:11] "GET /doc/5500c5d1724b595cf71b4d49?width=100 HTTP/1.1" 200 257495 1.024860
除了这些,我在终端中没有看到任何错误。当我尝试在浏览器中直接加载 url 时,它显示 The image cannot be displayed because it contains errors.
。我现在想知道两件事:
- 尽管所有请求似乎都成功 (200),但我在浏览器中看不到图像。为什么?
- 即使将图像加载到 Pillow 中需要一段时间(我认为不需要),我仍然希望图像最终加载。
有人知道为什么当我将图像加载到 Pillow 时没有提供图像吗?欢迎所有提示!
您对 Pillow 没有任何问题。您的问题是您提供的是 空响应 。如果您提供 缩略图 ,您要求 Pillow 阅读文件:
if desiredWidthStr or desiredHeightStr:
print 'THUMBNAIL'
im = Image.open(userDoc.file_) # reads from the file object
然后您尝试从那个 相同的文件对象:
提供服务
if desiredWidthStr or desiredHeightStr:
print 'THUMBNAIL'
# Load the image in Pillow
im = Image.open(userDoc.file_) # <=== THE PROBLEM!!!
# TODO: resize and save the image in /tmp
return Response(userDoc.file_.read(), mimetype=userDoc.file_.content_type)
这里的 userDoc.file_.read()
充其量只是 return 的部分图像,因为 Image.open()
已经移动了文件指针。这取决于图像类型实际读取了多少以及当时图像指针所在的位置。
添加 file.seek()
调用,您会看到您的图像重新出现:
if desiredWidthStr or desiredHeightStr:
print 'THUMBNAIL'
# Load the image in Pillow
im = Image.open(userDoc.file_)
print 'NORMAL'
userDoc.file_.seek(0) # ensure we are reading from the start
return Response(userDoc.file_.read(), mimetype=userDoc.file_.content_type)
我正在使用 Python Flask framework 建立网站。由于我将上传的图像存储在 MongoDB 中,我构建了一个简单的端点来通过 id:
提供图像@app.route('/doc/<docId>')
def getDoc(docId):
userDoc = UserDocument.objects(id=docId).first()
if not userDoc:
return abort(404)
return Response(userDoc.file_.read(), mimetype=userDoc.file_.content_type)
这非常有效。但由于图像通常非常大,我现在还希望能够提供原始图像的缩略图。所以使用 Pillow 我想调整图像的大小,store/cache 它们在 /tmp
中并在需要时提供它们。所以我从这个开始:
@app.route('/doc/<docId>')
def getDoc(docId):
userDoc = UserDocument.objects(id=docId).first()
if not userDoc:
return abort(404)
desiredWidthStr = request.args.get('width')
desiredHeightStr = request.args.get('height')
if desiredWidthStr or desiredHeightStr:
print 'THUMBNAIL'
# Load the image in Pillow
im = Image.open(userDoc.file_) # <=== THE PROBLEM!!!
# TODO: resize and save the image in /tmp
print 'NORMAL'
return Response(userDoc.file_.read(), mimetype=userDoc.file_.content_type)
当我现在注释掉有问题的行并打开首页(其中加载了几张图片)时,所有图片都加载正常并且我看到了这个(如预期的那样):
THUMBNAIL
NORMAL
THUMBNAIL
NORMAL
THUMBNAIL
NORMAL
212.xx.xx.xx - - [2015-03-19 16:57:02] "GET /doc/54e74956724b5907786e9918?width=100 HTTP/1.1" 200 139588 0.744827
212.xx.xx.xx - - [2015-03-19 16:57:03] "GET /doc/54e7495c724b5907786e991b?width=100 HTTP/1.1" 200 189494 1.179268
212.xx.xx.xx - - [2015-03-19 16:57:03] "GET /doc/5500c5d1724b595cf71b4d49?width=100 HTTP/1.1" 200 264593 1.416928
但是当我 运行 我粘贴上面的代码时(问题行没有注释)图像没有加载,我在终端看到这个:
THUMBNAIL
THUMBNAIL
THUMBNAIL
NORMAL
NORMAL
NORMAL
212.xx.xx.xx - - [2015-03-19 16:58:11] "GET /doc/54e74956724b5907786e9918?width=100 HTTP/1.1" 200 138965 0.657734
212.xx.xx.xx - - [2015-03-19 16:58:11] "GET /doc/54e7495c724b5907786e991b?width=100 HTTP/1.1" 200 188871 0.753112
212.xx.xx.xx - - [2015-03-19 16:58:11] "GET /doc/5500c5d1724b595cf71b4d49?width=100 HTTP/1.1" 200 257495 1.024860
除了这些,我在终端中没有看到任何错误。当我尝试在浏览器中直接加载 url 时,它显示 The image cannot be displayed because it contains errors.
。我现在想知道两件事:
- 尽管所有请求似乎都成功 (200),但我在浏览器中看不到图像。为什么?
- 即使将图像加载到 Pillow 中需要一段时间(我认为不需要),我仍然希望图像最终加载。
有人知道为什么当我将图像加载到 Pillow 时没有提供图像吗?欢迎所有提示!
您对 Pillow 没有任何问题。您的问题是您提供的是 空响应 。如果您提供 缩略图 ,您要求 Pillow 阅读文件:
if desiredWidthStr or desiredHeightStr:
print 'THUMBNAIL'
im = Image.open(userDoc.file_) # reads from the file object
然后您尝试从那个 相同的文件对象:
提供服务if desiredWidthStr or desiredHeightStr:
print 'THUMBNAIL'
# Load the image in Pillow
im = Image.open(userDoc.file_) # <=== THE PROBLEM!!!
# TODO: resize and save the image in /tmp
return Response(userDoc.file_.read(), mimetype=userDoc.file_.content_type)
这里的 userDoc.file_.read()
充其量只是 return 的部分图像,因为 Image.open()
已经移动了文件指针。这取决于图像类型实际读取了多少以及当时图像指针所在的位置。
添加 file.seek()
调用,您会看到您的图像重新出现:
if desiredWidthStr or desiredHeightStr:
print 'THUMBNAIL'
# Load the image in Pillow
im = Image.open(userDoc.file_)
print 'NORMAL'
userDoc.file_.seek(0) # ensure we are reading from the start
return Response(userDoc.file_.read(), mimetype=userDoc.file_.content_type)