java - AWS S3 响应失败,即使文件已完全上传
问题描述
我只是想通过 Android 应用程序将图像上传到 S3。到目前为止,我得出的结论是,上传大于 5MB 的图像没有问题,但是,小于 5MB 的图像已完全上传,可以手动从 S3 下载,但是,我得到的响应是 FAILED。我只是想提醒您,5MB 是发出多部分请求的最低阈值(当文件超过 5MB 时,SDK 会自动使用多部分上传,我在他们的代码中检查了这一点)。
我还手动检查了 md5 总和,以及两个文件(已上传并选择上传)的总和MATCH。
我测试了使用 AWS S3 CLI 上传小图像,它可以正常工作。
这是我得到的例外:
AmazonClientException: Unable to verify integrity of data upload. Client calculated content hash didn't match hash calculated by Amazon S3. You may need to delete the data stored in Amazon S3.
这些是我正在使用的库:
com.amazonaws:aws-android-sdk-s3:$version
com.amazonaws:aws-android-sdk-mobile-client:$version
任何帮助将非常感激。
解决方案
基本上,问题在于上传图像的存储桶是加密的,一旦我们创建了一个新的未加密存储桶,上传就很好了。似乎两个文件的哈希值不同,因为一个哈希计算是在加密文件上完成的,另一个是在未加密文件上完成的。似乎(尽管我不完全确定)多部分请求只是绕过了 md5 校验和检查。
值得一提的是,这仅在使用 Android SDK 时发生,iOS 工作正常(不知道实现的确切差异是什么,我可能稍后会更新)。
在引入加密之前,它工作了几个月。
如果有原因,我将进一步调查此问题并通知 AWS 支持。
推荐阅读
- ios - SwiftUI - 无法在列表中搜索和切换
- php - 在 laravel 查询中根据用户 ID 获取推荐用户
- reactjs - 将 typed.js 与 React 函数组件一起使用
- sql - 对非唯一值进行分区
- little-man-computer - 如何循环和编码为二进制?
- timer - STM32 HAL_Delay TIMER 微控制器
- php - session_name() 和 session_start() 无法正常工作
- python - 在 Django clean 方法之后但在提交之前会发生什么?
- sql - MS SQL - 按月对订单进行分组并显示该年的年度订单总额
- mysql - MYSQL 忽略 TIMEDIFF 中的负时间值