Загрузить файл, созданный с помощью fopen, в AWS S3 bucket - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть некоторый код PHP, который я использую для l oop через запрос к базе данных и создаю файл CSV. Файл создается с fopen() и загружается в конце процедуры. Нет проблем с этим. Однако в конце создания CSV я пытаюсь записать файл sh в корзину S3, используя тот же сгенерированный контент ($output).

Сбой со следующим сообщением:

AWS Тип ошибки: сервер, AWS Сообщение об ошибке: предоставленный вами заголовок подразумевает не реализованную функциональность, User-Agent : 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

Я знаю, что это связано с тем, что я пытаюсь передать поток как тело клавиши 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), он просто отлично загрузится:

s3->putObject([
    'Bucket' => 'mybucket',
    'Key' => "myfile.csv",
    'Body' => fopen('temp.csv', 'rb'),
    'ACL' => 'public-read'
            ]);

1 Ответ

0 голосов
/ 08 февраля 2020

Как согласно документам поток 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);

Отказ от ответственности: Я еще не проверял это, кричите, если у вас возникнут дальнейшие проблемы.

PS: Примечание: я изменил режим для ручки на w+, чтобы чтобы он тоже читался.

...