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)
从我(有限的)以前使用这些工具的经验来看,唯一的解决方案似乎是:
我的问题是:有没有更好的方法,我不必将它保存到我的应用程序服务器的磁盘之间?
启动此过程后,将生成 50 到 100 个 excel 文件,应该上传到 S3,因此我想尽可能简化该过程。
编辑:这可能是重复的问题只涉及 S3,而不是 PHPExcel。它不讨论 PHP,这是这个问题所涉及的。
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 行。在此之后,它工作得很好。
| 归档时间: |
|
| 查看次数: |
3173 次 |
| 最近记录: |