gpt4 book ai didi

php - 在 Amazon S3 中存储 PHPExcel 文件

转载 作者:行者123 更新时间:2023-12-04 02:02:08 26 4
gpt4 key购买 nike

我有一个创建大量 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 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'
));

从我(有限的)以前使用这些工具的经验来看,唯一的解决方案似乎是:
  • 将 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 可以使用它直接将数据写入保存中由该流引用定义的 s3 存储桶/文件

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

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

    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 行。
    在此之后,它工作得很好。

    关于php - 在 Amazon S3 中存储 PHPExcel 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30087358/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com