PHPExcel从aws s3读取流式文件

时间:2017-11-05 10:39:38

标签: php amazon-web-services amazon-s3 phpexcel

我正在尝试阅读存储在AWS S3存储桶中的一些Excel文件,但由于某些奇怪的原因,我遇到了.XLSX文件的问题,看起来像.XLS文件本身就是这样。

我在堆栈溢出中尝试了大部分答案,但我认为它与s3的流功能有关。

$xls_obj = array(
        'Bucket' => $attributes->report_bucket->StringValue,
        'Key'    => $attributes->report_key->StringValue
      );
$s3 = S3Client::factory(awsCred());
$s3->registerStreamWrapper();
$file = 's3://'.$xls_obj['Bucket'].'/'.$xls_obj['Key'];

这将返回我可以访问的文件路径。文件。 我然后将其加载到我的PHPExcel文件中。当我尝试识别它时,它将其显示为HTML,其中.XLS文件显示为excel5。

我确实尝试过使用

PHPExcel_Settings::setZipClass(PHPExcel_Settings::PCLZIP);

$reader = PHPExcel_IOFactory::createReaderForFile($file);
$reader->setReadDataOnly(true);
return $reader->load($file);

这显然给了我

DOMDocument::loadHTML(): Invalid char in CDATA 0x3 in Entity, line: 1

因为标识的格式是HTML 我无法使用来自S3的PUBLIC URL。所以我需要帮助!

1 个答案:

答案 0 :(得分:0)

因此,经过大量在线阅读后,我注意到,PHPExcel并不喜欢URL地址,这可能是Identify()给我HTML作为回应的原因。

所以,现在我设法通过将文件复制到tmp文件来解决这个问题,然后读取它然后将其删除。可能不是最好的解决方案,但现在它可以工作。

万一你想知道,我是怎么做的。

  $s3 = S3Client::factory(awsCred());
  $xls_obj = array(
        'Bucket' => $Bucket,
        'Key'    => $KEY,
        'SaveAs' => $path_folder."/".$fileName
  );

  $file = 's3://'.$xls_obj['Bucket'].'/'.$xls_obj['Key'];
  $s3->getObject($xls_obj); 
  

awsCred()是s3凭证的数组

然后我用这个函数返回PHPExcel文件:

function fileToExcelObj($file){
  /**
   * [fileToExcelObj description]
   * @param  {s3 Object} $file
   * @return {PHPExcel Obj}
  **/

  $reader = PHPExcel_IOFactory::createReaderForFile($file);
  return $reader->load($file);

}