我有一些 PHP 代码,用于循环数据库查询并创建 CSV 文件。
该文件是使用 fopen()
创建的,并在例程结束时下载。没问题。
但是,在 CSV 创建结束时,我尝试使用相同的生成内容 ($output
) 将文件推送到 S3 存储桶。
失败并显示以下消息:
AWS 错误类型:服务器,AWS 错误消息:您提供的 header 暗示未实现的功能,用户代理: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 key 的主体传递有关,但我不知道还能如何做到这一点。任何指示表示赞赏。 代码如下:
$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 存储桶),它会上传得很好:
s3->putObject([
'Bucket' => 'mybucket',
'Key' => "myfile.csv",
'Body' => fopen('temp.csv', 'rb'),
'ACL' => 'public-read'
]);
最佳答案
如per the docs流 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);
免责声明:我还没有测试过,如果你遇到进一步的麻烦,请大喊。
P.S.:请注意,我将句柄模式更改为 w+
,以便使其也可读。
关于php - 将使用 fopen 创建的文件上传到 AWS S3 存储桶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60121485/