仅当文件较大时才覆盖文件

时间:2018-10-17 15:51:49

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

我有这个小的代码可以将文件发送到S3存储桶:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent != null && intent.getStringExtra(INTENT_KEY_NAME) != null) {
        final String key = intent.getStringExtra(INTENT_KEY_NAME);
        final File file = (File) intent.getSerializableExtra(INTENT_FILE);
        final String transferOperation = intent.getStringExtra(INTENT_TRANSFER_OPERATION);
        TransferObserver transferObserver;

        switch (transferOperation) {
            case TRANSFER_OPERATION_DOWNLOAD:
                Log.d(TAG, "Downloading " + key);
                transferObserver = transferUtility.download("aws-mybucket", key, file);
                transferObserver.setTransferListener(new DownloadListener());
                break;
            case TRANSFER_OPERATION_UPLOAD:
                Log.d(TAG, "Uploading " + key);
                transferObserver = transferUtility.upload("aws-mybucket", key, file);
                transferObserver.setTransferListener(new UploadListener());
                break;
        }
        return START_STICKY;
    } else {
        return START_NOT_STICKY;
    }
}

这是我的实际存储桶策略:

{
"Version": "2008-10-17",
"Statement": [
    {
        "Sid": "AllowPublicRead",
        "Effect": "Allow",
        "Principal": {
            "AWS": "*"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::aws-mybucket/*"
    }
]
}

发送文件后,他们只会覆盖实际文件。我的问题是:是否有任何存储桶策略或存储桶配置仅在发送的文件大于实际文件大小的情况下才允许覆盖?谢谢。

1 个答案:

答案 0 :(得分:0)

从客户端逻辑中完成此操作的几种方法。

1)您可以使用Amazon S3提供的版本控制功能。您可以在存储桶上启用版本控制。您可以在每次上传期间将版本和元数据一起发送。缺点是您需要为维护多个版本付费。

2)在上传文件之前,您可以获取由键名标识的对象的元数据。元数据(如果存在通过密钥标识的对象)包含lastModifiedTime和大小。对于您的用例,您可以检查lastModifiedTime