在 Amazon S3 中存储 PHPExcel 文件

lsh*_*has 3 php amazon-s3 amazon-web-services phpexcel

我有一个创建大量 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');
Run Code Online (Sandbox Code Playgroud)

这是我通常用来保存文件的代码,但我不想将文件存储在我的应用程序服务器上,因此我将这些文件存储在 S3 Bucket 中。

这是我通常用来将文件上传到 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'
));
Run Code Online (Sandbox Code Playgroud)

从我(有限的)以前使用这些工具的经验来看,唯一的解决方案似乎是:

  1. 将 Excel 文档保存到我的应用服务器上的临时位置。
  2. 从临时位置将文件上传到 S3。
  3. 删除我的临时文件。

我的问题是:有没有更好的方法,我不必将它保存到我的应用程序服务器的磁盘之间?

启动此过程后,将生成 50 到 100 个 excel 文件,应该上传到 S3,因此我想尽可能简化该过程。

编辑:这可能是重复的问题只涉及 S3,而不是 PHPExcel。它不讨论 PHP,这是这个问题所涉及的。

Mar*_*ker 6

PHPExcel 本身没有内置快捷方法;但是由于 PHPExcel 允许您写入 PHP 支持的任何输出流,因此没有什么可以阻止您使用

$objWriter->save('s3://myS3bucket/filename.xlsx');
Run Code Online (Sandbox Code Playgroud)

通过 AWS S3 流包装器。

而不是使用

$s3->putObject(...);
Run Code Online (Sandbox Code Playgroud)

存储对象

您可以使用注册流包装器

$s3->registerStreamWrapper();
Run Code Online (Sandbox Code Playgroud)

然后最标准的PHP的文件操作(例如fopen()fwrite()file_put_contents()等等)可以由脚本直接使用,和PHPExcel可以用它来将数据直接写入到由在保存该流参考限定的S3桶/文件

请注意,我自己还没有尝试过,但没有理由认为它不应该以与使用 PHP 自己的内置流(如php://outputwork)完全相同的方式工作

提问者编辑: 我试过了,起初我抛出了这个错误:

无法关闭 zip 文件 s3://mybucket/test.xlsx

为了修复它,我必须在`PHPExcel/Writer/Excel2007.php` 中做一些调整

if (strtolower($pFilename) == 'php://output' ||
    strtolower($pFilename) == 'php://stdout')
{
Run Code Online (Sandbox Code Playgroud)

用这个切换这条线:

if (strtolower($pFilename) == 'php://output' || 
    strtolower($pFilename) == 'php://stdout' ||
    strstr($pFilename,'s3://') )
{
Run Code Online (Sandbox Code Playgroud)

就我而言,它在第 196 行。在此之后,它工作得很好。