如何使用 Android 的 AWS SDK 将图像上传到 Digital Ocean Spaces?

How to upload images to Digital Ocean Spaces using AWS SDK for Android?

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

将 sdk 添加到 android 工作室项目中的 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.You 首先使用 BasicAWSCredentails 创建用于访问 S3 的 AWS 凭证 class

2.Pass AmazonS3 实例的 AWS 凭证

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

4.You 将您的 BucketName、FileName 和 FileObject(要传输的)分配给 TransferObserver class

5.Finally 您使用 TransferObserver 的 setTransferListener 跟踪您的转账详情 class

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

    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/

你可以试试看这篇文章:

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

我写它是因为我找不到Java的任何好的例子。您也可以在 Android 中应用我的知识。这个想法是将图像转换为 base64 编码的字节数组,然后使用 AWS SDK 的端点 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();
}

如需完整教程,请参阅上面的文章 link。

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..!!