无法将文件推送到 php 中的 s3 存储桶

can't push file to s3 buket in php

我从 aws 文档中获取示例代码,但我总是收到此错误:IncalculablePayloadException

<?php $filepath = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]";
    
    
    require 'aws.phar';
    
    use Aws\S3\S3Client;
    use Aws\S3\Exception\S3Exception;
    
    $s3Key = 'mykey';
    $s3Secret = 'mysecretkey';
    $region = 'eu-west-3';
    $s3Bucket = 'mybucket';
    
    
    $bucket = $s3Bucket;
    $file_Path = $filepath.'/msk.png';
    $key = basename($filepath);
    echo $file_Path;
    try {
        //Create a S3Client
        $s3Client = new S3Client([
            'profile' => 'default',
            'region' => $region,
            'version' => '2006-03-01',
            // 'debug'   => true
        ]);
        $result = $s3Client->putObject([
            'Bucket' => $bucket,
            'Key' => $key,
            'SourceFile' => $file_Path,
        ]);
    } catch (S3Exception $e) {
        echo $e->getMessage() . "\n";
    }

我检查过我的文件存在,路径是正确的。我不知道该怎么做,这应该行得通,它来自他们该死的文档。 我尝试过其他文件,在其他地方找到了不同的代码,但我总是遇到同样的错误。 感谢您的帮助。

编辑 ---------- 1 我已将 $file_Path 更改为 $file_Path = 'msk.png'; 现在是 'working'。它将文件上传到 S3,但不是 png 而是 xml 文件。最后

<Code>AccessDenied</Code>
<Message>Access Denied</Message>

知道为什么吗? 编辑 ---------- 2 好的,现在我知道为什么了,文件的权限没有设置为读取 public 访问权限。如何使用 putObject 设置 ACL?

AWS PHP SDK DocumentationSourcePath 的描述如下:

The path to a file on disk to use instead of the Body parameter.

但是您提供的不是磁盘上的文件,而是 URL.

您有两个选择:

  • 根据路径在您的服务器上的位置,提供路径的磁盘位置。例如,使用 __DIR__ 来引用当前 PHP 文件的目录,它可能是 $file_Path = __DIR__ . '/../public/msk.png';
  • 先下载内容,然后将其作为字符串传递给 Body 参数而不是 SourcePath,例如使用 $body = file_get_contents($File_Path);

如果它是您自己服务器上的文件,第一个选项更有意义,但如果您简化了示例,第二个选项可能会有用。