有人请提供一个使用uploadDirectory
将一堆照片上传到S3的示例吗?假设我在Android设备上名为“special_photos”的目录中有300张照片。我想将所有这些照片上传到Amazon S3。我认为uploadDirectory
可能是执行此操作的最佳方法。但对亚马逊云来说,我不知道如何做到这一点。到目前为止我收集到的只是该方法异步执行,因此可以从主线程调用。我一直在互联网上找到PHP代码。但我不使用PHP。有没有人有一个完整的工作示例他们不介意与社区分享?我在Android Studio上通过gradle使用SDK。此外,是否有某种回调知道所有照片何时上传?比如说我想在上传后删除照片和目录。
答案 0 :(得分:1)
没有uploadDirectory
,但有Multipart Upload。这会将您的大数据上传到S3。如上所述HERE,分段上传文档说:
使用列表分段上传操作,您可以获取正在进行的分段上传列表。正在进行的分段上传是您已启动但尚未完成或中止的上传。每个请求最多返回1000个分段上传。如果正在进行的分段上传数量超过1000个,则需要发送其他请求以检索剩余的分段上传。
要解决回调问题,一旦上传了所有TransferUtility
项,就会调用完成。此open source添加了应用于上传功能的侦听器。我建议一次将你的电话分成30个,然后删除相应的照片 - 以防上传失败。有成功和失败的回报,所以显然只有在成功的情况下删除。
HERE是Android Multipart上传的AWS文档
HERE是一篇有助于迁移的文章。了解TransferManager
和TransferUtility
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上传多个图像的服务。至少这是我能够使它工作的方式。