ЕКС: Перевірка існування об'єкта S3
Summary: Як перевірити існування об'єкта в межах s3.
Instructions
Використання HEAD для більш ефективної перевірки існування об'єкта.
Перелік об'єктів за своєю суттю є неефективним способом перевірки на наявність конкретного об'єкта. Пошук за індексом не тільки відносно повільний для цього конкретного запиту, але й може вплинути на загальне навантаження та продуктивність.
Запит конкретного об'єкта завжди ефективніший, ніж запит одного або декількох об'єктів, які відповідають параметрам. Список об'єктів – це форма пошуку, де потрібно запитувати розподілені індекси.
Використання HEAD на об'єкті є найкращим методом перевірки його існування. З ECS object SDK це робиться за допомогою GetObjectMetadataRequest.
Якщо об'єкт НЕ існує, SDK викидає наступне виключення через відповідь на помилку 404:
Exception in thread "main" com.emc.object.s3.S3Exception: Not Found
Ось приклад використання GetObjectMetadataRequest, який використовується в клієнтському методі getObjectMetadata:
try { GetObjectMetadataRequest gom = new GetObjectMetadataRequest(<bucket>, <key>); S3ObjectMetadata om = s3.getObjectMetadata(gom); System.out.println("etag: " + om.getETag()); System.out.println("last modified: " + om.getLastModified().toString()); } catch(com.emc.object.s3.S3Exception e) { System.out.println("What happened: " + e.getMessage()); }
Якщо використовується AWS java SDK, а об'єкт не існує, SDK генерує наступне виключення.
com.amazonaws.services.s3.model.AmazonS3Exception: Not Found
Ось приклад цього:
try { GetObjectMetadataRequest gom = new GetObjectMetadataRequest(AWSS3Factory.S3_BUCKET, key); s3.getObjectMetadata(gom); } catch(com.amazonaws.services.s3.model.AmazonS3Exception e) { System.out.println("What happened: " + e.getMessage()); }
Перевірте, чи існує об'єкт, щоб визначити, чи потрібен putObject.
Якщо перевірка на існування об'єкта визначає, чи потрібен putObject, то розгляньте використання умовних методів PutObjectRequests:
withIfMatch() and withIfNoneMatch().
Обидва ці методи вимагають значення об'єкта etag і використовують заголовки "if-match", " if-none-match" у запиті PUT.
Існують також методи withIfUnmodifiedSince() та withIfModifiedSince(), кожен з яких приймає об'єкт Date.
Якщо etag або md5 недоступні, йому потрібно буде отримати його за допомогою GetObjectMetadataRequest.
Ефективною альтернативою було б використання withIfUnmodifiedSince(), якщо дата була достатньо старою.
СР з технічною підтримкою ECS
Якщо є занепокоєння щодо існування об'єкта, відкрийте запит на обслуговування в службі підтримки ECS.