【发布时间】:2015-06-25 00:31:02
【问题描述】:
我正在尝试将我的所有 asynctasks 和 HttpPost 代码转换为使用 Retrofit,到目前为止一切顺利,但我无法将用户文件上传到亚马逊 s3 存储桶。 文件上传分为两部分:
- 查询api获取upload_url和amazon上传参数。
- 使用第一次调用时提供的参数将文件上传到指定位置。
这是第一次调用时提供给我的参数示例列表。根据文档,这些值可以更改或不包含在内,并且第二次 api 调用必须按照提供的确切顺序调用这些参数。
"AWSAccessKeyId": "some_id",
"key": "/users/1234/files/profile_pic.jpg",
"acl": "private",
"Filename": "profile_pic.jpg",
"Policy": "some_opaque_string",
"Signature": "another_opaque_string",
"Content-Type": "image/jpeg"
为了处理动态内容。我创建了一个自定义转换器,以便在我的第一个 API 调用中让改造返回一个 LinkedHashMap。
public class CustomConverter implements Converter {
@Override public Object fromBody(TypedInput typedInput, Type type) throws ConversionException {
...
Type mapType = new TypeToken<LinkedHashMap<String, String>>(){}.getType();
return new Gson().fromJson(JSON_STRING, mapType);
}
然后在第二个 api 调用中,一旦我有了这些值,我通过迭代 HashMap 并添加每个项目来创建一个 FormUrlEncodedTypedOutput。
FormUrlEncodedTypedOutput params = new FormUrlEncodedTypedOutput();
for (Map.Entry<String, String> entry : uploadParams.entrySet()) {
params.addField(KEY, VALUE);
}
到目前为止,一切似乎都在工作。我得到了必要的上传参数,并且顺序似乎是一致的。我不太确定我是如何进行多部分改造呼叫设置的。然后,我在意图服务中的同步改造调用中使用它。
@Multipart
@POST("/")
Response uploadFile(@Part ("whatdoesthisdo?") FormUrlEncodedTypedOutput params, @Part("File") TypedFile file);
这会导致亚马逊错误。
"code" : "InvalidArgument"
"message" : "Bucket POST must contain a field named 'key'. If it is specified, please check the order of the fields."
我一直在谷歌搜索,似乎亚马逊更喜欢“关键”值排在第一位?但是,如果我将“密钥”放在“AWSAccessKeyId”前面,则会收到 403 未经授权的错误。我的改装呼叫设置是否正确?如果有人可以帮助我解决这个问题,我将不胜感激。将我上传的大部分代码转换为改造需要几天时间,如果我一直坚持这一点。
谢谢!
【问题讨论】:
-
如果可能的话,你能否展示你所有的代码,试图弄清楚如何从 Amazon S3 的签名响应中获取发回的信息
标签: android amazon-s3 retrofit