2012-08-22 60 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 –