使用PHPExcel和NginX上载和解析文件
因此,我尝试将xls和xlsx文件上传到我的服务器(Yii框架上的NginX),它有一个php脚本来解析数据并将其添加到数据库中 很简单 然而,我在第一个街区跌跌撞撞;上传文件时,PHPExcel似乎找不到该文件——老实说,我不确定它是否在那里,因为我无法完全理解它应该在哪里。下面是我的代码使用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
<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文件文档。这真的很酷。这个项目现在需要推进,但下一个我要做的,我会尝试这个方法。那真的很酷。这个项目现在需要推进,但下一个我做的项目,我会尝试这种方法。