2012-08-22 61 views
2

我有一个PHP脚本,用于上传CSV文件,然后将csv文件的一些内容保存到数据库中。当我使用大约40kb的文件时,脚本中的所有内容都可以正常工作,大约有100行。但是,当我尝试上载一个类似结构的文件,该文件是850 kb的大,出现此错误消息:上传csv文件时出现php大小错误

阵列([型] => 2048 [消息] =>只有变量应该通过参考分配 [文件] => /home/dir_name/uploader.php [行] => 10)

其从error_get_last()函数输出。

这里是我使用的脚本:

<?php 

/* 
* Config 
*/ 

mysql_connect(/* creds */) or die(mysql_error()); 
mysql_select_db('db_name'); 

$user =& JFactory::getUser(); 
$user_id = $user->get('id'); 

ini_set('error_log','/home/dir_name/error.log'); 
ini_set('upload_max_filesize', '50M'); 
ini_set('memory_limit','32M'); 
ini_set('post_max_size','32M'); 


/* 
* Upload CSV File 
*/ 

if (isset($_FILES['uploadedfile'])){ 
    if (substr($_FILES['uploadedfile']['name'],-3,3) == "csv"){ 
     echo $_FILES['uploadedfile']['name']."<br/>"; 
     $thefile = fopen($_FILES['uploadedfile']['tmp_name'],'r'); 
     if ($thefile === false){ 
      print_r(error_get_last()); 
      exit; 
     } 
     while (($data = fgetcsv($thefile, 0, ";",'"')) !== FALSE) { 
      if($data[0] == "Item Number"){ 
       continue; 
      } 
      /* 
      * Do all the stuff to data and save to db 
      */ 
      ... 
      ... 
     } 
     //header("Location: ".$_SERVER['PHP_SELF']); 
    } 
} 

?> 
<form enctype="multipart/form-data" method="POST"> 
    <input type="hidden" name="MAX_FILE_SIZE" value="100000" /> 
    Choose your CSV file of inventory: <input name="uploadedfile" type="file" /> 
    <input type="submit" value="Upload File" /> 
</form> 

正如你可以看到我已经手动设置upload_max_filesizememory_limitpost_max_size变量,因为我认为这可能是问题...但它没” t似乎改变了一切。任何有关这个问题的帮助将不胜感激。我希望能够使用此脚本上传BIG文件。 :-)

**编辑**

记住这个脚本效果很好,当该文件足够小。我用一个小文件(100行)再次尝试了它,它很好。我从第10行除去&,现在我在尝试一个更大的文件时,这个错误:

阵列([型] => 2048 [消息] =>只有变量应该被分配 通过引用[文件] => /home/dir_name/plugins/content/jw_simpleImageGallery/jw_simpleImageGallery.php [行] => 32)

此错误被在线路28上抛出由函数error_get_last,这意味着该fopen功能返回FALSE。打开上传的文件肯定是一个问题。由于某些原因,error_get_last函数显示错误(我认为它们是警告),这些错误与文件上传无关。

**编辑2 **

我查了一下PHP INI变量这样的瓦莱斯:

ini_set('error_log','/home/pkind2/tim/error.log'); 
ini_set('upload_max_filesize', '50M'); 
ini_set('memory_limit','32M'); 
ini_set('post_max_size','32M'); 
echo ini_get('upload_max_filesize').'<br>'; 
echo ini_get('memory_limit').'<br>'; 
echo ini_get('post_max_size').'<br>'; 

,输出是:

100 M 
50 M 
100 M 

我想我不有权改变这些变量,但是默认情况下它们已经设置得非常高,所以看起来这些变量看起来不像850K文件。

**编辑3 **

我检查的$_FILES['uploadedfile']['tmp_name']的价值,并为小FIEL(〜37 KB)我得到这样的输出:

/tmp/php7yto3f 

但是当我尝试了850 KB文件它不输出任何该变量,然后我得到崩溃。所以似乎该文件没有被保存到较大文件大小的临时位置。

**编辑4 **

原来,这个问题是<input type="hidden" name="MAX_FILE_SIZE" value="100000" />必须由100,000字节,或100 KB,所以我增加该值和大文件的工作...: -/

回答

2

我认为这个问题是在第10行:

$user =& JFactory::getUser(); 

尝试删除 “&”。

+0

非常感谢您的帮助,请参阅我的编辑 –

+1

尝试打印$ _FILES [ 'UploadedFile的'] [ 'tmp_name']并查看文件是否存在。 – fonini

+0

您确定可以使用ini_set()修改设置吗? – fonini

1

您是否看过错误?

线10:

$user =& JFactory::getUser(); 

& JFactory删除&,这是老PHP4风格

+0

感谢您在这里的帮助,请参阅我的编辑 –

+1

尝试传递'ini_get('upload_max_filesize');','echo ini_get('memory_limit');''''ini_get('post_max_size');''in'_inset '看看你是否真的修改ini的 –

+0

是的,我检查了这些,请参阅我的编辑2 –