使用PHPExcel和NginX上载和解析文件

使用PHPExcel和NginX上载和解析文件,php,file-upload,nginx,yii,phpexcel,Php,File Upload,Nginx,Yii,Phpexcel,因此,我尝试将xls和xlsx文件上传到我的服务器(Yii框架上的NginX),它有一个php脚本来解析数据并将其添加到数据库中 很简单 然而,我在第一个街区跌跌撞撞;上传文件时,PHPExcel似乎找不到该文件——老实说,我不确定它是否在那里,因为我无法完全理解它应该在哪里。下面是我的代码 <code> <?php spl_autoload_unregister(array('YiiBase','autoload')); /** Include path **/ set

因此,我尝试将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>
 /**  
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提供查找文件所需的内容,并且一旦我点击upload按钮(简单的html表单;我可以从$_POST获得文件名,所以我知道它已经走了这么远),该文件应该位于PHP的temp文件夹中,但要么它没有实际上载,要么它一旦启动就会丢失

非常感谢您的帮助

编辑:html上载表单:

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


编辑:


html上传表单出错;由于我没有设置enctype,$\u文件没有填充。将编码设置为multipart/formdata可以让我获得所需的信息。谢谢你们两位

由于您正在使用Yii,请使用
cuploaddedfile
类,调用
getInstance
以获取有关上载文件的访问和信息。据

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
}

由于您正在使用Yii,因此请使用
cuploaddedfile
类,调用
getInstance
以获取有关上载文件的访问和信息。据

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
}

我们可以看到文件上传的HTML吗?通常,您需要访问全局数组才能获得上载的文件信息。@ernie:添加了我的表单代码。我查看了$\u文件,但当我试图访问它时(与我通过foreach发布$\u文件的方式相同),它没有返回任何内容,所以想象它没有被填充。你能发布$\u文件的打印吗?您应该有$\u文件['file']['name']、$\u文件['file']['tmp\u name']和一些其他密钥。
echo打印的结果($\文件,真)是“Array()”,所以显然我没有给$\u文件文档。我们可以看到文件上传的HTML吗?通常,您需要访问全局数组才能获得上载的文件信息。@ernie:添加了我的表单代码。我查看了$\u文件,但当我试图访问它时(与我通过foreach发布$\u文件的方式相同),它没有返回任何内容,所以想象它没有被填充。你能发布$\u文件的打印吗?您应该有$\u文件['file']['name']、$\u文件['file']['tmp\u name']和一些其他密钥。
echo打印的结果($\文件,真)是“Array()”,所以显然我没有给$\u文件文档。这真的很酷。这个项目现在需要推进,但下一个我要做的,我会尝试这个方法。那真的很酷。这个项目现在需要推进,但下一个我做的项目,我会尝试这种方法。