如何使用Python将Amazon S3中的JPG文件加载至内存?Heroku部署场景下代码报错求助
解决PIL加载S3内存中图片的"embedded null byte"错误
你碰到的问题核心是:PIL的Image.open()并不直接支持传入原始字节数据——它需要的是类文件对象(比如磁盘文件路径,或者内存中的BytesIO对象),直接传入get_object返回的字节串,就会触发这个null字节解析错误。
修复方案:用BytesIO包装字节数据
只需要把下载到的字节数据转换成类文件对象,就能让PIL正常读取,而且全程在内存处理,完全适配Heroku的无磁盘需求:
- 先导入
io模块的BytesIO:
import boto3 from PIL import Image from io import BytesIO # 新增这行导入
- 修改下载后的图片加载逻辑:
# 你的上传代码保持不变 s3.upload_fileobj(image_conv, bucket, Key = "image_3.jpg") # 下载并处理图片 new_obj = s3.get_object(Bucket=bucket, Key="image_3.jpg") image_dl = new_obj['Body'].read() # 用BytesIO把字节数据包装成类文件对象 image_stream = BytesIO(image_dl) # 现在可以正常打开图片了 loaded_image = Image.open(image_stream)
此时loaded_image就会变成你期望的<PIL.JpegImagePlugin.JpegImageFile>类型,完全在内存中完成处理,不需要写入磁盘。
原理说明
BytesIO会模拟出磁盘文件的读写接口,把你的字节数据转换成PIL能识别的"文件流",这样PIL就可以像读取本地图片文件一样解析它,自然就不会再出现null字节的错误了。
内容的提问来源于stack exchange,提问作者FluffySheep1990
相关产品推荐
相关产品推荐

