Php 将使用fopen创建的文件上载到AWS S3 bucket
我有一些PHP代码,用于循环数据库查询并创建CSV文件。 该文件是使用Php 将使用fopen创建的文件上载到AWS S3 bucket,php,amazon-s3,fopen,Php,Amazon S3,Fopen,我有一些PHP代码,用于循环数据库查询并创建CSV文件。 该文件是使用fopen()创建的,并在例程结束时下载。没问题。 但是,在CSV创建结束时,我尝试使用相同的生成内容($output)将文件推送到S3存储桶 它失败,并显示以下消息: AWS错误类型:服务器,AWS错误消息:您提供的标题暗示未实现的功能,用户代理:AWS-sdk-php2/2.7.27 Guzzle/3.9.3 curl/7.47.0 PHP/7.0.33-0ubuntu0.16.04.9在第91行的/www/MIND/ge
fopen()
创建的,并在例程结束时下载。没问题。
但是,在CSV创建结束时,我尝试使用相同的生成内容($output
)将文件推送到S3存储桶
它失败,并显示以下消息:
AWS错误类型:服务器,AWS错误消息:您提供的标题暗示未实现的功能,用户代理:AWS-sdk-php2/2.7.27 Guzzle/3.9.3 curl/7.47.0 PHP/7.0.33-0ubuntu0.16.04.9在第91行的/www/MIND/gen6portal/vendor/AWS/AWS-sdk PHP/src/AWS/Common/Exception/NamespaceExceptionFactory.PHP中抛出
我知道这与我试图将流作为S3键体进行传递有关,但我不知道其他方法如何进行。任何指点都很感激。
代码如下:
$output = fopen('php://output', 'w');
while ($rows = mysqli_fetch_assoc($result)) {
fputcsv($output, $rows); // there's some more processing that I do but this works fine
}
//Now I want to upload it to S3:
$s3->putObject([
'Bucket' => 'mybucket',
'Key' => 'myfile.csv',
'Body' => $output,
'ACL' => 'public-read'
]);
fclose($output);
有趣的是,如果我只是尝试获取一个现有文件(以验证我是否有权访问该S3 bucket),它可以正常上传:
s3->putObject([
'Bucket' => 'mybucket',
'Key' => "myfile.csv",
'Body' => fopen('temp.csv', 'rb'),
'ACL' => 'public-read'
]);
作为流php://output
是一个只写流,因此您无法再次从中读取
但是,您可以使用临时流,如下所示:
$output = fopen('php://memory', 'w+');
while ($rows = mysqli_fetch_assoc($result)) {
fputcsv($output, $rows);
}
rewind($output);
$s3->putObject([
'Bucket' => 'mybucket',
'Key' => 'myfile.csv',
'Body' => stream_get_contents($output),
'ACL' => 'public-read'
]);
fclose($output);
免责声明:我还没有测试过,如果你遇到进一步的麻烦,大声说出来
注意:我将句柄的模式更改为
w+
,以使其可读。在尝试将文件发送到S3之前,似乎应该先关闭()文件。如果文件写入仍处于打开状态,则该文件仍在使用中且不可用。是否有原因不能将其放入临时文件,然后将该临时文件上载到S3?谢谢。我尝试了临时文件方法,但遇到了“拒绝访问”问题:致命错误:未捕获Aws\S3\Exception\AccessDeniedException:Aws错误代码:拒绝访问,状态代码:403,Aws请求ID:07AA8C5530D16350,Aws错误类型:客户端,Aws错误消息:拒绝访问,用户代理:aws-sdk-php2/2.7.27 Guzzle/3.9.3 curl/7.47.0 PHP/7.0.33-0ubuntu0.16.04.9插入/www/MIND/gen6portal/vendor/aws/aws-sdk-PHP/src/aws/Common/Exception/NamespaceExceptionFactory.PHP第91行我知道我有该bucket的写入权限,如果我尝试通过PHP从服务器上传一个现有文件,效果很好。这与使用内存流有什么关系?那么你是用内存流还是临时文件来尝试的?内存不应该有任何权限问题,因为它发生在PHP进程内部。我尝试使用一个临时文件和一个内存流,但得到了相同的拒绝访问错误。这就像S3不喜欢我试图上传的东西。但我100%确定我有正确的权限。