---
title: 'Drupal 7 AWS S3 и проверка файла на существование'
url: 'https://graker.ru/news/2019/03/21/drupal-7-aws-s3-file-exists'
language: ru
type: post
author: 'Роман Грачев'
published: '2019-03-21T10:15:00+03:00'
updated: '2019-03-21T10:20:23+03:00'
categories:
  - Программирование
  - Друпальчики
---

# Drupal 7 AWS S3 и проверка файла на существование

Есть в Drupal такой модуль, [S3FS](https://www.drupal.org/project/s3fs), создает стрим-враппер `s3://` для работы с файловыми бакетами на Amazon S3. Модуль в принципе удобный и работает, но вот только не все файловые функции умеют в такой стрим. Например, если мы хотим проверить, существует ли в бакете файл, то `file_exists('s3://myfile.txt')` всегда вернёт `FALSE`.

Если заглянуть в код класса `S3fsStreamWrapper`, то там для проверки используется `$this->s3->doesObjectExist()`. Можно было бы сделать красиво, вот так:

```
file_stream_wrapper_get_instance_by_scheme('s3')
  ->s3
  ->doesObjectExists('my-bucket', 'myfile.txt');
```

Только вот незадача: `$this->s3` — клиент S3 `Aws\S3\S3Client`, вокруг которого работает стрим-враппер — это protected-свойство.

Пришлось ковыряться и делать некрасиво:

```
$config = _s3fs_get_config();
$s3 = _s3fs_get_amazons3_client($config);
$s3->doesObjectExist('my-s3-bucket', $filename);
```

То есть вытягивать конфиги, создавать клиент вручную, и тогда уже проверять.

А мораль такая. Если вы пишете враппер вокруг какого-нибудь сервиса, и решили сделать свойство, содержащее объект сервиса, недоступным снаружи — подумайте. Может хоть геттер добавить стоит, если уж не реализуете обертку над каждым полезным методом?
