php - 将使用 fopen 创建的文件上传到 AWS S3 存储桶

标签 php amazon-s3 fopen

我有一些 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 docsphp://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/

相关文章:

c - 简单的 C 程序打开一个文件

c - 如何用 fwrite() 覆盖偏移量 Y 上的 X 个字节?

php - MYSQL 更新连接错误 ->

php - 如何在 MAMP PRO v3.4 中更新 MySQL 版本

amazon - 同步 S3 存储桶

java - S3 上传中的加密

c - fopen c 多个文件

php - session 未开始? + 奇怪的错误消息

PHP CodeIgniter 如何将特定页面上的 Https(SSL) 设置为子域(例如 mypage.domain.com)?

java - 从 S3 上的视频创建缩略图而无需下载