使用从服务器端应用程序生成的已签名 URL 将文件(视频文件)从 android 上传到 S3 服务器
Uploading files (video files) to S3 server from android using signed URL’s generated from server side application
我正在尝试使用从服务器端(在 python 中编码)应用程序生成的签名 URLs 从 android 应用程序将视频文件上传到 S3 服务器中的存储桶.我们正在向已签名的 URL 发出 PUT 请求,但我们得到
connection reset by peer exception
.
但是当我在 POSTMAN REST CLIENT 上尝试相同的 URL 时,会收到一条成功消息。
任何帮助将不胜感激。
使用 Retrofit HTTP 客户端库完成此操作,成功将文件上传到 Amazon s3 服务器。
代码:
public interface UploadService {
String BASE_URL = "https://bucket.s3.amazonaws.com/folder";
/**
* @param url :signed s3 url string after 'BASE_URL'.
* @param file :file to upload,( usage: new TypedFile("mp4", videoFile);.
* @param cb :callback.
*/
@PUT("/{url}")
void uploadFile(@Path(value = "url", encode=false) String url, @Body() TypedFile file, Callback<String> cb);
}
服务class
public final class ServiceGenerator {
private ServiceGenerator() {
}
public static <S> S createService(Class<S> serviceClass, String baseUrl) {
return createService(serviceClass, baseUrl, null, null);
}
public static <S> S createService(Class<S> serviceClass, String baseUrl, final String accessToken, final String tokenType) {
class MyErrorHandler implements ErrorHandler {
@Override public Throwable handleError(RetrofitError cause) {
return cause;
}
}
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.registerTypeAdapter(Date.class, new DateTypeAdapter())
.disableHtmlEscaping()
.create();
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(baseUrl)
.setClient(new OkClient(new OkHttpClient()))
.setErrorHandler(new MyErrorHandler())
.setLogLevel(RestAdapter.LogLevel.FULL)
.setConverter(new GsonConverter(gson));
if (accessToken != null) {
builder.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("Accept", "application/json;versions=1");
request.addHeader("Authorization", tokenType +
" " + accessToken);
}
});
}
RestAdapter adapter = builder.build();
return adapter.create(serviceClass);
}
并使用:
UploadService uploadService = ServiceGenerator.createService(UploadService.class,UploadService.BASE_URL);
uploadService.uploadFile(remUrl,typedFile,new CallbackInstance());
使用动态URL而不是提供基础URL,使用@Url而不是@Path并传递一个完整的URI,默认encode=false
例如:
@Multipart
@PUT
@Headers("x-amz-acl:public-read")
Call<Void> uploadFile(@Url String url, @Header("Content-Type") String contentType, @Part MultipartBody.Part part);
我正在尝试使用从服务器端(在 python 中编码)应用程序生成的签名 URLs 从 android 应用程序将视频文件上传到 S3 服务器中的存储桶.我们正在向已签名的 URL 发出 PUT 请求,但我们得到
connection reset by peer exception
.
但是当我在 POSTMAN REST CLIENT 上尝试相同的 URL 时,会收到一条成功消息。 任何帮助将不胜感激。
使用 Retrofit HTTP 客户端库完成此操作,成功将文件上传到 Amazon s3 服务器。
代码:
public interface UploadService {
String BASE_URL = "https://bucket.s3.amazonaws.com/folder";
/**
* @param url :signed s3 url string after 'BASE_URL'.
* @param file :file to upload,( usage: new TypedFile("mp4", videoFile);.
* @param cb :callback.
*/
@PUT("/{url}")
void uploadFile(@Path(value = "url", encode=false) String url, @Body() TypedFile file, Callback<String> cb);
}
服务class
public final class ServiceGenerator {
private ServiceGenerator() {
}
public static <S> S createService(Class<S> serviceClass, String baseUrl) {
return createService(serviceClass, baseUrl, null, null);
}
public static <S> S createService(Class<S> serviceClass, String baseUrl, final String accessToken, final String tokenType) {
class MyErrorHandler implements ErrorHandler {
@Override public Throwable handleError(RetrofitError cause) {
return cause;
}
}
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.registerTypeAdapter(Date.class, new DateTypeAdapter())
.disableHtmlEscaping()
.create();
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(baseUrl)
.setClient(new OkClient(new OkHttpClient()))
.setErrorHandler(new MyErrorHandler())
.setLogLevel(RestAdapter.LogLevel.FULL)
.setConverter(new GsonConverter(gson));
if (accessToken != null) {
builder.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("Accept", "application/json;versions=1");
request.addHeader("Authorization", tokenType +
" " + accessToken);
}
});
}
RestAdapter adapter = builder.build();
return adapter.create(serviceClass);
}
并使用:
UploadService uploadService = ServiceGenerator.createService(UploadService.class,UploadService.BASE_URL);
uploadService.uploadFile(remUrl,typedFile,new CallbackInstance());
使用动态URL而不是提供基础URL,使用@Url而不是@Path并传递一个完整的URI,默认encode=false
例如:
@Multipart
@PUT
@Headers("x-amz-acl:public-read")
Call<Void> uploadFile(@Url String url, @Header("Content-Type") String contentType, @Part MultipartBody.Part part);