2

league/flysystem在 laravel 上使用带有 Flystem 驱动程序的软件包。

我目前正在尝试重命名目录。据我了解,我需要为此使用该move()方法。在本地文件系统驱动程序上,这工作正常。但是,在使用 s3 时,出现以下错误:

"Error executing "GetObjectAcl" on "https://asgard-modules-dev.s3-eu-west-1.amazonaws.com/assets/media/test-s3?acl"; 

AWS HTTP error: Client error: `GET https://asgard-modules-dev.s3-eu-west-1.amazonaws.com/assets/media/test-s3?acl` resulted in a `404 Not Found` response:↵
<?xml version="1.0" encoding="UTF-8"?>↵

<Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message> (truncated...)↵ 

NoSuchKey (client): The specified key does not exist. - <?xml version="1.0" encoding="UTF-8"?>↵

<Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message><Key>assets/media/test-s3</Key><RequestId>B50AF4134D66FA68</RequestId><HostId>yliO7CUIt5PBsix/C339BrdFzrMTsKsommGc0fVOculaITBfC9CDPg2X43oXnW9RjnvRynmi39k=</HostId></Error>"

当我转储我的fromto路径时,我有正确的路径名:

"/assets/media/test-s3" (from)
"/assets/media/test-s3333" (to)

from 路径确实存在于该位置。

我错过了什么吗?

谢谢!

4

1 回答 1

1

由于 S3 不允许您移动目录(因为它们实际上不是目录),因此您必须手动移动其中的所有文件并删除旧目录。

这是我的解决方案的一些示例代码:

class S3BucketService
{
    const SERVICE = 's3';

    /**
     * @param string $from
     * @param string $to
     * @return bool
     */
    public static function moveDirectory(string $from, string $to)
    {
        if (Storage::disk(static::SERVICE)->has($from)) {
            $folderContents = Storage::disk(static::SERVICE)->listContents($from, true);
            foreach ($folderContents as $content) {
                if ($content['type'] === 'file') {
                    $src  = $content['path'];
                    $dest = str_replace($from, $to, $content['path']);
                    Storage::disk(static::SERVICE)->move($src, $dest);
                }
            }

            Storage::disk(static::SERVICE)->deleteDirectory($from);
        }
    }
}

在此示例中,我有一个项目文件夹,所有文件都将嵌套在该文件夹下。

$from 将类似于projectId projectname/Documents

$to 将类似于projectId projectname/OtherDocumentFolder

注意:SERVICE 常量也是可选的,但在我的项目中,我连接到多个云存储服务,并且这个类扩展了另一个并覆盖了父类的 SERVICE。

于 2020-01-27T21:02:54.957 回答