【问题标题】:Uploading and parsing a file with PHPExcel and NginX使用 PHPExcel 和 NginX 上传和解析文件
【发布时间】:2012-11-20 18:05:54
【问题描述】:

所以,我正在尝试将 xls 和 xlsx 文件上传到我的服务器(Yii 框架上的 NginX),它有一个 php 脚本来解析数据并将其添加到数据库中。

足够简单。

但是,我在第一个街区绊倒了;上传文件时,PHPExcel 似乎无法找到该文件 - 老实说,我不确定它是否存在,因为我无法充分了解它应该在哪里。下面是我的代码

<code>
<?php
spl_autoload_unregister(array('YiiBase','autoload')); 

/** Include path **/

set_include_path(get_include_path() . PATH_SEPARATOR . '/usr/share/nginx/www/dashboard/protected/extensions/phpexcel/Classes/');


/** PHPExcel_IOFactory */

include 'PHPExcel/IOFactory.php';
spl_autoload_register(array('YiiBase','autoload'));

echo $_FILES . "<br />";

$inputFileName = $_POST;

foreach ($inputFileName as $key => $value) {
    echo "Key: $key; Value: $value<br />\n";
    }
    echo $inputFileName["file"] . "<br />";

echo 'Loading file ',pathinfo($inputFileName["file"],PATHINFO_BASENAME),' using IOFactory to identify the format<br />'; 

//This is where it breaks  
$objPHPExcel = PHPExcel_IOFactory::load($inputFileName["file"]);
</code>

当它中断时,它会给我这个错误:

<code>
Could not open Active, Telemetered, Electricity Accounts 17-10-2012.xlsx for reading! File does not exist.
</code>

还有这个堆栈跟踪:

<code>
 /**  
225      * Can the current PHPExcel_Reader_IReader read the file?  
226      *  
227      * @param     string         $pFileName  
228      * @return     boolean  
229      * @throws Exception  
230      */
231     public function canRead($pFilename)  
232     {  
233         // Check if file exists  
234         if (!file_exists($pFilename)) {  
235             throw new Exception("Could not open " . $pFilename . " for reading! File does not exist.");  
236         }  
237 
238         // Check if zip class exists  
239         if (!class_exists('ZipArchive',FALSE)) {  
240             throw new Exception("ZipArchive library is not enabled");  
241         }  
</code>

现在,据我了解,pathinfo() 应该已经为 PHP 提供了查找文件所需的内容,并且一旦我点击上传按钮,该文件应该位于 php 的临时文件夹中(简单的 html 表单;我可以获得来自 $_POST 的文件名,所以我知道它已经走了那么远),但要么它实际上没有上传,要么一旦它启动它就会丢失。

非常感谢任何帮助!

编辑:html 上传表单:

<code>
<form action="testFile" method="post">
<label for="file" />
<input type="file" name="file"   />
<br />
<input type="submit">
</form>
</code>

编辑:

html 上传表单有问题;因为我没有设置 enctype,所以 $_FILES 没有被填充。将编码设置为多部分/表单数据让我获得所需的信息。谢谢两位!

【问题讨论】:

  • 我们可以看到文件上传的 HTML 吗?一般来说,你需要访问全局$_FILES数组来获取上传的文件信息。
  • @ernie:添加了我的表单代码。我查看了 $_Files,但是当我尝试访问它时(就像我通过上面的 foreach 执行 $_POST 一样),它没有返回任何内容,所以想象它没有被填充。
  • 您可以发布 $_FILES 的 print_r 吗?您应该有 $_FILES['file']['name']、$_FILES['file']['tmp_name'] 和其他一些键。
  • 嗯。 echo print_r( $_FILES, TRUE ); 的结果是 'Array ( )' 所以显然我没有给 $_FILES 文档..

标签: php file-upload nginx yii phpexcel


【解决方案1】:

由于您使用的是 Yii,请使用 CUploadedFile 类,请致电 getInstance 以获取有关上传文件的访问权限和信息。根据Yii Documentation on CUploadedFile

CUploadedFile 表示上传文件的信息。

调用getInstance 获取上传文件的实例,然后使用saveAs 将其保存在服务器上。您还可以查询文件的其他信息,包括名称、临时名称、类型、大小和错误。

例如:

$form->model->xlsx = CUploadedFile::getInstance($form->model, 'xlsx');
//save the file, as an example I am assuming that file is an xlsx
$file = '/importedfiles/'.uniqid().".xlsx";
if($model->xlsx->saveAs($file))
{
//import PHPExcel if you have not already done so
Yii::import('sharedLibraries.PHPExcel.PHPExcel',true);
                
$inputFileType = PHPExcel_IOFactory::identify($file);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($file);
$objWorksheet = $objPHPExcel->getActiveSheet();
..........
}
else
{
//handle the error as file could not be saved
}

【讨论】:

  • 这真的很酷。这个项目现在需要推进,但我下一个项目,我会尝试这种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
相关资源
最近更新 更多