使用从android到S3的uploadDirectory的示例

时间:2016-01-20 02:46:52

标签: java android amazon-web-services amazon-s3

有人请提供一个使用uploadDirectory将一堆照片上传到S3的示例吗?假设我在Android设备上名为“special_photos”的目录中有300张照片。我想将所有这些照片上传到Amazon S3。我认为uploadDirectory可能是执行此操作的最佳方法。但对亚马逊云来说,我不知道如何做到这一点。到目前为止我收集到的只是该方法异步执行,因此可以从主线程调用。我一直在互联网上找到PHP代码。但我不使用PHP。有没有人有一个完整的工作示例他们不介意与社区分享?我在Android Studio上通过gradle使用SDK。此外,是否有某种回调知道所有照片何时上传?比如说我想在上传后删除照片和目录。

2 个答案:

答案 0 :(得分:1)

没有uploadDirectory,但有Multipart Upload。这会将您的大数据上传到S3。如上所述HERE,分段上传文档说:

  

使用列表分段上传操作,您可以获取正在进行的分段上传列表。正在进行的分段上传是您已启动但尚未完成或中止的上传。每个请求最多返回1000个分段上传。如果正在进行的分段上传数量超过1000个,则需要发送其他请求以检索剩余的分段上传。

要解决回调问题,一旦上传了所有TransferUtility项,就会调用完成。此open source添加了应用于上传功能的侦听器。我建议一次将你的电话分成30个,然后删除相应的照片 - 以防上传失败。有成功和失败的回报,所以显然只有在成功的情况下删除。

HERE是Android Multipart上传的AWS文档

HERE是一篇有助于迁移的文章。了解TransferManagerTransferUtility

之间的差异

HERE是关于开始使用Android TransferManager

的好文章

HERE是一个开源演示 - 在S3_TransferManager

希望这有帮助!

更新

以下代码全部来自@awslabs参考

创建客户端

public static AmazonS3Client getS3Client(Context context) {
    if (sS3Client == null) {
        sS3Client = new AmazonS3Client(getCredProvider(context.getApplicationContext()));
    }
    return sS3Client;
}

创建TransferUtility:

public static TransferUtility getTransferUtility(Context context) {
    if (sTransferUtility == null) {
        sTransferUtility = new TransferUtility(getS3Client(context.getApplicationContext()),
                context.getApplicationContext());
    }
    return sTransferUtility;
}

使用TransferUtility获取所有上传内容:

observers = transferUtility.getTransfersWithType(TransferType.UPLOAD);

添加记录 - 您可以遍历目录中的文件名

HashMap<String, Object> map = new HashMap<String, Object>();
Util.fillMap(map, observer, false);
transferRecordMaps.add(map);

这会启动所有内容:

private void beginUpload(String filePath) {
    if (filePath == null) {
        Toast.makeText(this, "Could not find the filepath of the selected file",
                Toast.LENGTH_LONG).show();
        return;
    }
    File file = new File(filePath);
    TransferObserver observer = transferUtility.upload(Constants.BUCKET_NAME, file.getName(),
            file);
    observers.add(observer);
    HashMap<String, Object> map = new HashMap<String, Object>();
    Util.fillMap(map, observer, false);
    transferRecordMaps.add(map);
    observer.setTransferListener(new UploadListener());
    simpleAdapter.notifyDataSetChanged();
}

这是您的完成情况:

private class GetFileListTask extends AsyncTask<Void, Void, Void> {
    // The list of objects we find in the S3 bucket
    private List<S3ObjectSummary> s3ObjList;
    // A dialog to let the user know we are retrieving the files
    private ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(DownloadSelectionActivity.this,
                getString(R.string.refreshing),
                getString(R.string.please_wait));
    }

    @Override
    protected Void doInBackground(Void... inputs) {
        // Queries files in the bucket from S3.
        s3ObjList = s3.listObjects(Constants.BUCKET_NAME).getObjectSummaries();
        transferRecordMaps.clear();
        for (S3ObjectSummary summary : s3ObjList) {
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("key", summary.getKey());
            transferRecordMaps.add(map);
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        dialog.dismiss();
        simpleAdapter.notifyDataSetChanged();
    }
}

答案 1 :(得分:0)

您可以将列表发送到使用TransferUtility上传多个图像的服务。至少这是我能够使它工作的方式。