Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将使用fopen创建的文件上载到AWS S3 bucket_Php_Amazon S3_Fopen - Fatal编程技术网

Php 将使用fopen创建的文件上载到AWS S3 bucket

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

我有一些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/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%确定我有正确的权限。