我正在尝试使用预签名URL将文件上传到亚马逊S3。我从服务器获取该URL,该服务器生成URL并将其作为JSON对象的一部分发送给我。我将URL作为字符串获取,类似于以下内容:
很不幸的是,当我将此传递给Retrofit2时,它会修改字符串并尝试将其转换为URL。我已经设置了encoding=true
,这解决了大部分问题,但并非完全解决。我知道这个字符串本来是可以工作的。我在Postman中尝试过,并获得了成功的响应。首先,我尝试将整个字符串(除了baseUrl之外剪切的部分)直接放入路径中。
public interface UpdateImageInterface {
@PUT("{url}")
Call<Void> updateImage(@Path(value="url", encoded=true) String url, Body RequestBody image);
}
调用代码:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://com-example-mysite.s3-us-east-1.amazonaws.com/userFolder/")
.build();
UpdateImageInterface imageInterface = retrofit.create(UpdateImageInterface.class);
// imageUrl is "ImageName..."
Call<Void> call = imageInterface.updateImage(imageUrl, requestFile);
这个方法基本可行,但是“ImageName”后面的“?”会被转换为“%3F”,导致请求失败/400错误。
我接下来尝试使用Retrofit2创建查询,然后将整个包含多个查询的字符串转储到查询中。
public interface UpdateImageInterface {
@PUT("ImageName")
Call<Void> updateProfilePhoto(@Query(value="X-Amz-Security-Token", encoded = true) String token, @Body RequestBody image);
}
调用代码:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://com-example-mysite.s3-us-east-1.amazonaws.com/userFolder/")
.build();
UpdateImageInterface imageInterface = retrofit.create(UpdateImageInterface.class);
// imageUrl is "xxfooxx..."
Call<Void> call = imageInterface.updateImage(imageUrl, requestFile);
这样可以正确呈现'?',但所有的'&'都会被改变为"%26"。
最后,我尝试将整个字符串传递给
baseUrl()
,但是由于结尾没有'/'而导致IllegalArgumentException报错。我知道我可以解析预签名URL以进行多个查询并在Retrofit2中组装它们,因为应该使用查询,但我想避免这种处理。
重述问题如下:
有没有一种简单的方法(不需要大量字符串解析)使用Retrofit2和预签名URL上传文件到S3?