在 Amazon S3 中存储 PHPExcel 文件
Store PHPExcel files in Amazon S3
我有一个创建大量 Excel 文件的应用程序,我想将这些文件存储在 Amazon S3 中供以后使用。
$objPHPExcel = PHPExcel_IOFactory::load('template.xlsx');
$objPHPExcel->getActiveSheet()->getCell('A1')->setValue('SomeVal');
// ...
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('filename.xlsx');
这是我通常用来保存文件的代码,但我不想将文件存储在我的应用程序服务器上,所以我打算将它们存储在 S3 存储桶中。
这是我通常用来将文件上传到 S3 的代码:
$s3 = S3Client::factory(array(
'key' => AWS_KEY,
'secret' => AWS_SECRET
));
$result = $s3->putObject(array(
'Bucket' => AWS_BUCKET,
'Key' => 'somefileinmybucket.jpg',
'SourceFile' => $filepath,
'ACL' => 'private'
));
从我以前使用这些工具的(有限的)经验来看,唯一的解决方案似乎是:
- 将 Excel 文档保存到我的应用程序服务器上的临时位置。
- 将文件从临时位置上传到 S3。
- 删除我的临时文件。
我的问题是:有没有更好的方法,我不必在中间将它保存到我的应用程序服务器的磁盘?
此过程启动后,将生成 50 到 100 个 excel 文件,并且应该上传到 S3,因此我想尽可能简化该过程。
编辑:这可能是重复的问题只涉及 S3,而不是 PHPExcel。而且它不讨论PHP,这是这个问题所涉及的。
PHPExcel本身没有内置快捷方式;但由于 PHPExcel 允许您写入 PHP 支持的任何输出流,因此没有什么可以阻止您使用
$objWriter->save('s3://myS3bucket/filename.xlsx');
通过 AWS S3 流包装器。
而不是使用
$s3->putObject(...);
存储对象
您可以使用
注册流包装器
$s3->registerStreamWrapper();
然后大多数标准 PHP 文件操作(例如 fopen()
、fwrite()
、file_put_contents()
等)可以直接从您的脚本中使用,并且 PHPExcel 可以使用它直接将数据写入由 save
中该流引用定义的 s3 bucket/file
请注意,我自己还没有尝试过,但没有理由认为它不能以与使用 PHP 自己的内置流(如 [=18=)完全相同的方式工作] 工作
提问者编辑:
我试过了,起初我抛出了这个错误:
Could not close zip file s3://mybucket/test.xlsx
要修复它,我必须在`PHPExcel/Writer/Excel2007.php``
中做一些调整
if (strtolower($pFilename) == 'php://output' ||
strtolower($pFilename) == 'php://stdout')
{
将此行切换为:
if (strtolower($pFilename) == 'php://output' ||
strtolower($pFilename) == 'php://stdout' ||
strstr($pFilename,'s3://') )
{
在我的例子中,它在第 196 行。
在此之后,它工作得很好。
我有一个创建大量 Excel 文件的应用程序,我想将这些文件存储在 Amazon S3 中供以后使用。
$objPHPExcel = PHPExcel_IOFactory::load('template.xlsx');
$objPHPExcel->getActiveSheet()->getCell('A1')->setValue('SomeVal');
// ...
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('filename.xlsx');
这是我通常用来保存文件的代码,但我不想将文件存储在我的应用程序服务器上,所以我打算将它们存储在 S3 存储桶中。
这是我通常用来将文件上传到 S3 的代码:
$s3 = S3Client::factory(array(
'key' => AWS_KEY,
'secret' => AWS_SECRET
));
$result = $s3->putObject(array(
'Bucket' => AWS_BUCKET,
'Key' => 'somefileinmybucket.jpg',
'SourceFile' => $filepath,
'ACL' => 'private'
));
从我以前使用这些工具的(有限的)经验来看,唯一的解决方案似乎是:
- 将 Excel 文档保存到我的应用程序服务器上的临时位置。
- 将文件从临时位置上传到 S3。
- 删除我的临时文件。
我的问题是:有没有更好的方法,我不必在中间将它保存到我的应用程序服务器的磁盘?
此过程启动后,将生成 50 到 100 个 excel 文件,并且应该上传到 S3,因此我想尽可能简化该过程。
编辑:这可能是重复的问题只涉及 S3,而不是 PHPExcel。而且它不讨论PHP,这是这个问题所涉及的。
PHPExcel本身没有内置快捷方式;但由于 PHPExcel 允许您写入 PHP 支持的任何输出流,因此没有什么可以阻止您使用
$objWriter->save('s3://myS3bucket/filename.xlsx');
通过 AWS S3 流包装器。
而不是使用
$s3->putObject(...);
存储对象
您可以使用
注册流包装器$s3->registerStreamWrapper();
然后大多数标准 PHP 文件操作(例如 fopen()
、fwrite()
、file_put_contents()
等)可以直接从您的脚本中使用,并且 PHPExcel 可以使用它直接将数据写入由 save
请注意,我自己还没有尝试过,但没有理由认为它不能以与使用 PHP 自己的内置流(如 [=18=)完全相同的方式工作] 工作
提问者编辑: 我试过了,起初我抛出了这个错误:
Could not close zip file
s3://mybucket/test.xlsx
要修复它,我必须在`PHPExcel/Writer/Excel2007.php``
中做一些调整if (strtolower($pFilename) == 'php://output' ||
strtolower($pFilename) == 'php://stdout')
{
将此行切换为:
if (strtolower($pFilename) == 'php://output' ||
strtolower($pFilename) == 'php://stdout' ||
strstr($pFilename,'s3://') )
{
在我的例子中,它在第 196 行。 在此之后,它工作得很好。