Как проверить, существует ли указанный ключ в данном ведре S3 с помощью Java



Я хотел бы проверить, существует ли ключ в данном ведре с помощью Java. Я посмотрел на API, но нет никаких методов, которые были бы полезны. Я пытался использовать getObject но это вызвало исключение.

795   13  

13 ответов:

используйте библиотеку jets3t. Его намного проще и надежнее, чем AWS sdk. С помощью этой библиотеки вы можете вызвать, s3service.getObjectDetails (). Это позволит проверить и получить только детали объекта (не содержимое) объекта. Он будет бросать 404, если объект отсутствует. Таким образом, вы можете поймать это исключение и справиться с ним в своем приложении.

но для того, чтобы это работало, вам нужно будет иметь доступ к ListBucket для пользователя на этом ведре. Просто GetObject доступа не будет работа. Причина в том, что Amazon не позволит вам проверить наличие ключа, если у вас нет доступа к ListBucket. Просто зная, присутствует ли ключ или нет, также будет достаточно для вредоносных пользователей в некоторых случаях. Следовательно, если у них нет доступа к ListBucket, они не смогут этого сделать.

теперь doesObjectExist метод в официальном Java API.

наслаждайтесь!

использовать errorCode.equals("NoSuchKey")

try {
    AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());
    String bucketName = getBucketName();
    s3.createBucket(bucketName);
    S3Object object = s3.getObject(bucketName, getKey());
} catch (AmazonServiceException e) {
    String errorCode = e.getErrorCode();
    if (!errorCode.equals("NoSuchKey")) {
        throw e;
    }
    Logger.getLogger(getClass()).debug("No such key!!!", e);
}

примечание об исключении: я знаю, что исключения не должны быть использованы для управления потоком. Проблема в том, что Amazon не предоставил api для проверки этого потока - только документацию об исключении.

использование AWS SDK используйте метод getObjectMetadata. Метод вызовет исключение AmazonServiceException, если ключ не существует.

private AmazonS3 s3;
...
public boolean exists(String path, String name) {
    try {
        s3.getObjectMetadata(bucket, getS3Path(path) + name); 
    } catch(AmazonServiceException e) {
        return false;
    }
    return true;
}

в Amazon Java SDK 1.10+ вы можете использовать getStatusCode() получить код состояния HTTP-ответа, который будет 404, если объект не существует.

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.AmazonS3Exception;
import org.apache.http.HttpStatus;

try {
    AmazonS3 s3 = new AmazonS3Client();
    S3Object object = s3.getObjectMetadata("my-bucket", "my-client");
} catch (AmazonS3Exception e) {
    if (e.getStatusCode() == HttpStatus.SC_NOT_FOUND) {
        // bucket/key does not exist 
    } else {
        throw e;
    }
}

getObjectMetadata() потребляет меньше ресурсов, и ответ не должен быть закрыт как getObject().


в предыдущих версиях, вы можете использовать getErrorCode() и проверить соответствующую строку (зависит от версии).

используйте префикс настройки ListObjectsRequest в качестве ключа.

.NET код:

 public bool Exists(string key)
    {

        using (Amazon.S3.AmazonS3Client client = (Amazon.S3.AmazonS3Client)Amazon.AWSClientFactory.CreateAmazonS3Client(m_accessKey, m_accessSecret))
        {
            ListObjectsRequest request = new ListObjectsRequest();
            request.BucketName = m_bucketName;
            request.Prefix = key;
            using (ListObjectsResponse response = client.ListObjects(request))
            {

                foreach (S3Object o in response.S3Objects)
                {
                    if( o.Key == key )
                        return true;
                }
                return false;
            }
        }
    }.

для PHP (я знаю, что вопрос Java, но Google привел меня сюда), вы можете использовать обертки потока и file_exists

$bucket = "MyBucket";
$key = "MyKey";
$s3 = Aws\S3\S3Client->factory([...]);
$s3->registerStreamWrapper();
$keyExists = file_exists("s3://$bucket/$key");

этот код java проверяет, существует ли ключ (файл) в корзине s3.

public static boolean isExistS3(String accessKey, String secretKey, String bucketName, String file) {

    // Amazon-s3 credentials
    AWSCredentials myCredentials = new BasicAWSCredentials(accessKey, secretKey); 
    AmazonS3Client s3Client = new AmazonS3Client(myCredentials); 

    ObjectListing objects = s3Client.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(file));

    for (S3ObjectSummary objectSummary: objects.getObjectSummaries()) {
        if (objectSummary.getKey().equals(file)) {
            return true;
        }
    }
    return false;
}

использование объекта isting. Функция Java для проверки наличия указанного ключа в AWS S3.

boolean isExist(String key)
    {
        ObjectListing objects = amazonS3.listObjects(new ListObjectsRequest().withBucketName(bucketName).withPrefix(key));

        for (S3ObjectSummary objectSummary : objects.getObjectSummaries())
        {
            if (objectSummary.getKey().equals(key))
            {
                return true;
            }

        }
        return false;
    }

разбить свой путь в ведро и объекта. Тестирование ведра с помощью метода doesBucketExist, Тестирование объекта с использованием размера списка (0 в случае отсутствия). Так что этот код будет делать:

String bucket = ...;
String objectInBucket = ...;
AmazonS3 s3 = new AmazonS3Client(...);
return s3.doesBucketExist(bucket) 
       && !s3.listObjects(bucket, objectInBucket).getObjectSummaries().isEmpty();

существует простой способ сделать это с помощью метода isObjectInBucket () API JETS3T.

пример кода:

ProviderCredentials awsCredentials = new AWSCredentials(
                awsaccessKey,
                awsSecretAcessKey);

        // REST implementation of S3Service
        RestS3Service restService = new RestS3Service(awsCredentials);

        // check whether file exists in bucket
        if (restService.isObjectInBucket(bucket, objectKey)) {

            //your logic

        }

в качестве альтернативы вы можете использовать Minio-Java клиентская библиотека, ее открытый исходный код и совместимость с API AWS S3.

вы можете использовать Minio-Java StatObject.java примеры для того же.

import io.minio.MinioClient;
import io.minio.errors.MinioException;

import java.io.InputStream;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;

import org.xmlpull.v1.XmlPullParserException;


public class GetObject {
  public static void main(String[] args)
    throws NoSuchAlgorithmException, IOException, InvalidKeyException, XmlPullParserException, MinioException {
    // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are
    // dummy values, please replace them with original values.
    // Set s3 endpoint, region is calculated automatically
    MinioClient s3Client = new MinioClient("https://s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY");
    InputStream stream = s3Client.getObject("my-bucketname", "my-objectname");

    byte[] buf = new byte[16384];
    int bytesRead;
    while ((bytesRead = stream.read(buf, 0, buf.length)) >= 0) {
      System.out.println(new String(buf, 0, bytesRead));
    }

    stream.close();
  }
}

Я надеюсь, что это помогает.

отказ от ответственности : я работаю на Minio

используйте метод doesBucketExist S3Client в AWS SDK

  static final AmazonS3 S3_CLIENT = AmazonS3ClientBuilder.defaultClient();
    if (!S3_CLIENT.doesBucketExist(bucketName)) {
            CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName, region);
            Bucket bucket = S3_CLIENT.createBucket(createBucketRequest);

            logger.log("Created Bucket Name" + bucket.getName() + " | Creation :" + bucket.getCreationDate());
        }

надеюсь, что это помогает.

Comments

    Ничего не найдено.