上传JPEG至Digital Ocean Spaces时文件损坏问题求助
直接上传JPEG到DigitalOcean Spaces损坏的解决办法
问题背景
- 前端通过HTML表单接收JPEG图片:
<input id="myFileInput" name="file" type="file" accept="image/*" capture="camera" onchange="readURL(this);" autocomplete="off" required style="width: 100%">
- 后端Python接收图片对象:
file = request.files['file'] # JPEG image file
- 使用boto3直接上传该文件对象到DigitalOcean Spaces,上传成功但图片无法打开(疑似损坏),上传代码如下:
from boto3 import session ACCESS_ID = zzzzzzzzzzz SECRET_KEY = xxxxxxxxxxxxx session = session.Session() client = session.client('s3', region_name='sgp1', endpoint_url='https://sgp1.digitaloceanspaces.com', aws_access_key_id=ACCESS_ID, aws_secret_access_key=SECRET_KEY) # 上传到DigitalOcean Spaces client.upload_fileobj(file, 'DO_Bucket', 'DO_path' + filename, ExtraArgs={'ACL': 'public-read'})
- 已验证可行方案:先将文件保存到本地再上传,图片可正常查看:
client.upload_file('file_path' + filename, 'DO_Bucket', 'DO_path' + filename, ExtraArgs={'ACL': 'public-read'})
需求:无需保存到本地,直接上传文件对象即可让图片正常访问。
解决方案
上传文件对象前,必须重置文件指针到起始位置。修改后的代码如下:
from boto3 import session ACCESS_ID = zzzzzzzzzzz SECRET_KEY = xxxxxxxxxxxxx session = session.Session() client = session.client('s3', region_name='sgp1', endpoint_url='https://sgp1.digitaloceanspaces.com', aws_access_key_id=ACCESS_ID, aws_secret_access_key=SECRET_KEY) # 重置文件指针到开头,确保读取完整文件内容 file.seek(0) # 上传文件对象 client.upload_fileobj(file, 'DO_Bucket', 'DO_path' + filename, ExtraArgs={'ACL': 'public-read'})
原因说明
request.files['file']获取的文件对象在被读取(比如获取文件名、大小、格式校验)后,内部指针会移动到文件末尾。upload_fileobj默认从当前指针位置开始读取内容,此时读取的是空白数据,导致上传的图片损坏。调用file.seek(0)将指针重置到起始位置,就能保证上传完整的图片数据。
内容的提问来源于stack exchange,提问作者Mandar
相关产品推荐
相关产品推荐

