You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

上传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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:15:20