android - 使用从服务器端应用程序生成的签名 URL 从 Android 将文件(视频文件)上传到 S3 服务器

标签 android file-upload amazon-s3 pre-signed-url

我正在尝试使用从服务器端(用 python 编码)应用程序生成的签名 URL 从 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);
}

服务等级

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

关于android - 使用从服务器端应用程序生成的签名 URL 从 Android 将文件(视频文件)上传到 S3 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28616942/

相关文章:

java - 如何在 GingerBread 2.3.3 中导入 .so 文件?

php - PH值错误: notice : undefined variable : id in c:\wamp how to fix it?? $_SESSION 错误

c# - ASP .Net Web API RC : Multipart file-upload to Memorystream

amazon-s3 - 防止机器人创建多个免费帐户和上传文件

amazon-s3 - 如何访问转储在 S3 中的 AWS SES 电子邮件的内容?

android - 与 removeAllViewsInLayout()、postInvalidate() 和 refreshDrawableState() 混淆

java - 如何将文件上传集成到 Spring Data REST 存储库中?

java - NoClassDefFound错误: org/apache/commons/io/output/DeferredFileOutputStream in uploading file with SpringMVC/Wildfly/CentOS

hadoop - Hadoop Distcp-在不同位置之间复制时出现小文件问题

android - 如何防止 View 超出 CardView 的圆角?