2

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

数组 ( [type] => 2048 [message] => 只有变量应该通过引用分配 [file] => /home/dir_name/uploader.php [line] => 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变量,因为我认为这可能是问题所在......但它似乎没有改变任何东西。任何有关此问题的帮助将不胜感激。我希望能够使用此脚本上传BIG文件。:-)

** 编辑 **

请记住,当文件足够小时,此脚本运行良好。我用一个小文件(100行)再次尝试了它,它很好。我从第 10 行删除了 &,现在在尝试更大的文件时出现此错误:

数组( [type] => 2048 [message] => 只有变量应该通过引用分配 [file] => /home/dir_name/plugins/content/jw_simpleImageGallery/jw_simpleImageGallery.php [line] => 32)

这个错误是由第error_get_last28 行的函数抛出的,这意味着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

我想我没有更改这些变量的权限,但默认情况下它们已经设置得非常高,所以看起来这些变量不会妨碍 850 k 文件。

** 编辑 3 **

我检查了 的值$_FILES['uploadedfile']['tmp_name'],对于小字段 ( ~ 37 kb ),我得到以下输出:

/tmp/php7yto3f

但是当我尝试 850 KB 文件时,它不会为该变量输出任何内容,然后我就崩溃了。所以看起来文件没有被保存到更大的文件大小的临时位置。

** 编辑 4 **

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

4

2 回答 2

2

我认为问题出在第 10 行:

$user =& JFactory::getUser();

尝试删除“&”。

于 2012-08-22T11:14:07.193 回答
1

你读过错误吗?

第 10 行:

$user =& JFactory::getUser();

remove &from & JFactory, 那是旧的 PHP4 风格

于 2012-08-22T11:15:24.650 回答