Как удалить папку с файлами с помощью Google Storage REST api?

#php #google-cloud-storage

#php #google-облачное хранилище

Вопрос:

Я пытаюсь удалить _$folder$ из хранилища Google, используя их REST api. Я пробовал до сих пор headerserver.com/testestset/* , headerserver.com/testestset headerserver.com/testestset_$folder$ но, похоже, ни один из них не работает, когда в папке есть какие-либо файлы.

Единственный подход, который я придумал до сих пор, — это foreach все объекты под _$folder$ , прежде чем пытаться удалить его, однако это крайне неэффективно.

В худшем случае: возможно ли пакетное / удаление более одного файла за один запрос?

Ответ №1:

Прошло 4 года, а они все еще не предоставляют для этого надлежащего API.

Для вас, кому все еще нужно обойти, вот вариант.

В этом примере необходимо удалить родительскую папку, ее вложенные папки и все их содержимое

 <?php

/**
 * Delete nested folders for Google Cloud Storage
 */

class ClassName {

    /** @var Google_Service_Storage $storageService */
    public $storageService;

    /** @var string $bucket */
    public $bucket = '';

    /**
     * Remove an object
     *
     * @param string $objectPath
     * @return boolean
     */
    public function removeObject($objectPath) {
        // validator
        try {
            if (!$this->storageService->objects->get($this->bucket, $objectPath)) {
                // log error
                return false;
            }
        } catch (Exception $ex) {
            // leave this empty
        }

        // remove action
        try {
            $this->storageService->objects->delete($this->bucket, $objectPath);
        } catch (Exception $ex) {
            // log error
            return false;
        }
        // log success

        return true;
    }

    /**
     * Remove the specified container
     *
     * @param string $path
     * @return boolean
     */
    public function removeContainer($path) {
        $c = array();
        $c['delimiter'] = '/';
        if (!empty($path) amp;amp; $path != '/') {
            $c['prefix'] = $path;
        }
        $objects = null;

        // validator
        try {
            $objects = $this->storageService->objects->listObjects($this->bucket, $c);
            if (empty($objects)) {
                if (!$this->storageService->objects->get($this->bucket, $path)) {
                    // log error
                    return false;
                }
            }
        } catch (Exception $ex) {
            // leave this empty
        }

        // remove action
        try {
            if (empty($objects)) {
                $this->storageService->objects->delete($this->bucket, $path);
            } else {
                /**
                 * Process files first
                 */
                $files = $objects->getItems();
                if (!empty($files)) {
                    foreach ($files as $file) {
                        $this->removeObject($file->getName());
                    }
                }
                /**
                 * And folders later
                 */
                $folders = $objects->getPrefixes();
                if (!empty($folders)) {
                    foreach ($folders as $folder) {
                        $this->removeContainer($folder);
                    }
                }
            }
        } catch (Exception $ex) {
            // log error
            return false;
        }
        // log success

        return true;
    }

}
  

Вот как это регистрируется в базе данных, чтобы объяснить рекурсивный процесс.

рекурсивное удаление папок

Если вам интересно, почему в журнале дважды появлялись пустые папки для file_remove и directory_remove , в этой $objects = $this->driver->objects->listObjects($this->bucket, $c); части имя папки указано обратно в $files = $objects->getItems(); ,

может быть потому, что это не физическая папка, а скорее пустой файл, который представляется как папка.

Ответ №2:

К сожалению, нет другого способа, кроме удаления всех объектов с помощью каталога или _$folder$ объекта.