【问题标题】:How to upload images to Digital Ocean Spaces using AWS SDK for Android?如何使用适用于 Android 的 AWS 开发工具包将图像上传到 Digital Ocean Spaces?
【发布时间】:2018-05-21 06:15:11
【问题描述】:

由于 Digital Ocean Spaces API 与 AWS SDK 兼容,如何使用适用于 Android 的 AWS SDK 以编程方式将图像上传到 Digital Ocean Spaces?

【问题讨论】:

    标签: android api amazon-web-services spaces


    【解决方案1】:

    将 sdk 添加到您的 android studio 项目中的 build.gradle:

    compile 'com.amazonaws:aws-android-sdk-core:2.6.9'
    compile 'com.amazonaws:aws-android-sdk-s3:2.6.9'
    compile 'com.amazonaws:aws-android-sdk-ddb:2.6.9'
    

    在清单文件中添加以下服务:

    <service android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService"
        android:enabled="true" />
    

    基本步骤:

    1.您首先使用 BasicAWSCredentails 类创建用于访问 S3 的 AWS 凭证

    2.将 AWS 凭证传递给 AmazonS3 实例

    3.然后将 AmazonS3 对象传递给 TransferUtility 类

    4.您将您的 BucketName、FileName 和 FileObject(将被转移)分配给 TransferObserver 类

    5.最后,您使用 TransferObserver 类的 setTransferListener 跟踪您的传输详细信息

    代码(经过测试和工作):

        AmazonS3Client s3;
        BasicAWSCredentials credentials;
        TransferUtility transferUtility;
        final TransferObserver observer;
        String key = "YOUR_SPACES_KEY";
        String secret = "YOUR_SPACES_SECRET_KEY";
    
        credentials = new BasicAWSCredentials(key, secret);
        s3 = new AmazonS3Client(credentials);
        s3.setEndpoint("https://BUCKET_NAME.nyc3.digitaloceanspaces.com/DIRECTORY_IF_NEEDED");
    
        transferUtility = new TransferUtility(s3, activity);
        CannedAccessControlList filePermission = CannedAccessControlList.PublicRead;
    
        observer = transferUtility.upload(
                "", //empty bucket name, included in endpoint
                "FILE_NAME.PNG",
                new File(), //a File object that you want to upload
                filePermission
        );
    
        observer.setTransferListener(new TransferListener() {
            @Override
            public void onStateChanged(int id, TransferState state) {
                if (state.COMPLETED.equals(observer.getState())) {
                    Toast.makeText(activity, "Space upload completed !!", Toast.LENGTH_SHORT).show();
                }
            }
    
            @Override
            public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
            }
    
            @Override
            public void onError(int id, Exception ex) {
                Toast.makeText(activity, "Space upload error: " + ex.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    

    参考来自:http://yasirameen.com/2016/10/uploading-file-to-amazon-s3/

    【讨论】:

    • 如何获取文件路径?我一直找不到文件
    • @jacobian:文件路径是您要上传的文件的位置,因此它取决于您的应用程序上下文。例如,如果您想上传用户从图库中挑选的图像,您可以查看:stackoverflow.com/questions/42344154/…
    • 我不认为将 YOUR_SPACES_KEY 放在应用端可以吗?
    【解决方案2】:

    您可以尝试阅读这篇文章:

    Send Image from Java to DigitalOcean Space (Bucket) using AWS SDK

    我写它是因为我找不到任何 Java 的好例子。您也可以将我的知识应用到 Android 中。这个想法是您将图像转换为 base64 编码的字节数组,然后使用 AWS 开发工具包的端点 putObject() 并将 ObjectMetadata 作为参数传递。在此对象中,您指定字符串表示的内容(“image/jpg”),仅此而已。

    public String uploadBase64ToStorage(int userid, String location, String strimage) {
        AWSCredentialsProvider awscp = new AWSStaticCredentialsProvider(
                new BasicAWSCredentials("DO_ACCESS_KEY", "DO_SECRET_KEY")
        );
        AmazonS3 space = AmazonS3ClientBuilder
                .standard()
                .withCredentials(awscp)
                .withEndpointConfiguration(
                        new AwsClientBuilder.EndpointConfiguration("BUCKET_ENDPOINT", "BUCKET_REGION")
                )
                .build();
        byte[] byteimage = Base64.getDecoder().decode(strimage);
        InputStream is = new ByteArrayInputStream(byteimage);
        ObjectMetadata om = new ObjectMetadata();
        om.setContentLength(byteimage.length);
        om.setContentType("image/jpg");
        String filepath = /somefolder/someanotherfolder/testfile.jpg";
        space.putObject("BUCKET_NAME", filepath, is, om);
        return space.getUrl("BUCKET_NAME", filepath).toString();
    }
    

    如需完整教程,请点击上面的文章链接。

    【讨论】:

      【解决方案3】:
      In case anyone is looking for Core Java implementation see below code,
      
          public static String uploadToDOSpaces(InputStream uploadedInputStream, String fileName1, String bucketPath,
                  String ext1) {
              Timestamp timestamp = new Timestamp(System.currentTimeMillis());
              String bucketName = "files" + bucketPath;
              String keyName = timestamp.getTime() + ext1;
              AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                      .withEndpointConfiguration(
                              new AwsClientBuilder.EndpointConfiguration("region.digitaloceanspaces.com", "your region"))
                      .withCredentials(new AWSStaticCredentialsProvider(
                              new BasicAWSCredentials("Access-Key", "Secret-Key")))
                      .build();
              ObjectMetadata meta = new ObjectMetadata();
              byte[] bytes = null;
              try {
                  bytes = IOUtils.toByteArray(uploadedInputStream);
              } catch (IOException e) {
              }
              meta.setContentLength(bytes.length);
              meta.setContentDisposition("inline");
          
              switch (ext1) {
              case "txt":
                  meta.setContentType("text/plain");
                  break;
              case "pdf":
                  meta.setContentType("application/pdf");
                  break;
              case "jpeg":
                  meta.setContentType("image/jpeg");
                  break;
              case "jpg":
                  meta.setContentType("image/jpeg");
                  break;
              case "gif":
                  meta.setContentType("image/gif");
                  break;
              case "png":
                  meta.setContentType("image/png");
                  break;
              case "PNG":
                  meta.setContentType("image/png");
                  break;
              case "mp4":
                  meta.setContentType("video/mp4");
                  break;
              case "MP4":
                  meta.setContentType("video/mp4");
                  break;
              }
          
              ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
              s3Client.putObject(new PutObjectRequest(bucketName, keyName, byteArrayInputStream, meta)
                      .withCannedAcl(CannedAccessControlList.PublicRead));
              java.util.Date expiration = new java.util.Date();
              long msec = expiration.getTime();
              msec += 1000 * 60 * 60; // 1 hour.
              expiration.setTime(msec);
              URL abc = s3Client.generatePresignedUrl(bucketName, keyName, expiration);
              String abcurl = abc.toString();
              String[] urls = abcurl.split("\\?");
              return urls[0];
          }
      
      Also here are maven dependencies.
      
             <dependency>
                  <groupId>com.amazonaws</groupId>
                  <artifactId>aws-java-sdk-s3</artifactId>
                  <version>1.11.511</version>
              </dependency>
      
              <dependency>
                  <groupId>com.amazonaws</groupId>
                  <artifactId>aws-java-sdk-core</artifactId>
                  <version>1.11.511</version>
              </dependency>
      
      Thanks and cheers..!!
      

      【讨论】:

        猜你喜欢
        • 2023-01-31
        • 2018-03-19
        • 2019-05-11
        • 2013-02-04
        • 2022-12-22
        • 2022-11-02
        • 2012-11-28
        • 2020-01-01
        • 2013-05-12
        相关资源
        最近更新 更多