#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$
объекта.