无法将文件推送到 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 Documentation 对 SourcePath
的描述如下:
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);
如果它是您自己服务器上的文件,第一个选项更有意义,但如果您简化了示例,第二个选项可能会有用。
我从 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 Documentation 对 SourcePath
的描述如下:
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);
如果它是您自己服务器上的文件,第一个选项更有意义,但如果您简化了示例,第二个选项可能会有用。