代码之家  ›  专栏  ›  技术社区  ›  Jason Axelrod

Amazon S3 PHP SDK,传输文件夹,但跳过特定文件?

  •  2
  • Jason Axelrod  · 技术社区  · 6 年前

    我正在使用amazonhppsdk将服务器上的一个文件夹上传到一个bucket中。这很有效:

    $skip = ['index.html', '_metadata.txt', '_s3log.txt'];
    
    $meta = [
        'key' => $options->EWRbackup_s3_key,
        'region' => $options->EWRbackup_s3_region,
        'bucket' => $options->EWRbackup_s3_bucket,
        'directory' => 's3://'.$options->EWRbackup_s3_bucket.'/'.$subdir,
    ];
    
    $client = new S3Client([
        'version' => 'latest',
        'region'  => $meta['region'],
        'credentials'   => [
            'key'       => $meta['key'],
            'secret'    => $options->EWRbackup_s3_secret,
        ]
    ]);
    
    $s3log = fopen($subpath.'/_s3log.txt', 'w+');
    fwrite($s3log, "-- Connecting to ".$meta['region'].":".$meta['bucket']."...\n");
    
    $manager = new Transfer($client, $subpath, $meta['directory'], [
        'before' => function ($command)
            {
                $filename = basename($command->get('SourceFile'));
                fwrite($this->s3log, "-- Sending file $filename...\n");
            },
    ]);
    $manager->transfer();
    
    fwrite($s3log, "-- Disconnecting from ".$meta['key'].":".$meta['bucket']."...");
    fclose($s3log);
    

    但是,在我使用 Transfer 方法,有3个文件我想跳过。它们在 $skip 换乘 要跳过这3个文件。。。

    0 回复  |  直到 6 年前
        1
  •  0
  •   user11990065    5 年前

    我在我创建的WordPress插件中修改了AWS客户端。AWS/S3/Transfer.php 在本例中,文件是管理上传的地方。我修改了 private function upload($filename) 要从before函数中查找布尔返回值,请执行以下操作:

    private function upload($filename)
    {
        $args = $this->s3Args;
        $args['SourceFile'] = $filename;
        $args['Key'] = $this->createS3Key($filename);
        $command = $this->client->getCommand('PutObject', $args);
        if ($this->before) {
            if (false!==call_user_func($this->before, $command)) {
                return $this->client->executeAsync($command);
            }
        } else {
            return $this->client->executeAsync($command);
        }
    }
    

    这将替换原始行:

        $this->before and call_user_func($this->before, $command);
        return $this->client->executeAsync($command);
    

    具有

        if ($this->before) {
            if (false!==call_user_func($this->before, $command)) {
                return $this->client->executeAsync($command);
            }
        } else {
            return $this->client->executeAsync($command);
        }
    

    before 函数,可以返回 false 如果你不想上传这个文件。

    我之所以能够做到这一点,是因为我可以控制何时更新AWS PHP SDK,因此可以修改它包含的代码。我在phpsdk中还没有找到更好的钩子。