2015-02-19 3 views
4

Я пытаюсь загрузить видео файлы в Bucket на сервере S3 из приложения Android с помощью подписанных URL-адресов, которые создаются на стороне сервера (закодированные в python). Мы делаем запрос PUT на подписанный URL-адрес, но мы получаемЗагрузка файлов (видеофайлов) на сервер S3 из android с использованием подписанного URL-адреса, созданного с помощью приложения на стороне сервера

connection reset by peer exception.

Но когда я пытаюсь использовать тот же URL-адрес в POSTMAN REST CLIENT, получите сообщение об успешном завершении. Любая помощь будет оценена по достоинству.

ответ

3

Выполнено с использованием 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); 
} 

класс обслуживания

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()); 
+0

Как я могу кормить Идентичность идентификатор Cognito и маркер доступа здесь – Aerrow

+0

Эй @Aerrow, если вам нужно Cognito, возможно, вам не нужно загружать с подписанными URLs. Вы можете предоставить пользователю пул пользователей cognito доступ к определенному вами ведру. – Andres

+0

Привет @Shijil просто заглядывает в эту тему сегодня. Я вижу, что ваш вызов Retrofit придает некоторые заголовки запросу. Это для вашей собственной модели безопасности, верно? Не вещь AWS, правильно? – Andres

0

Используйте динамический 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);