CSV ファイルをアップロードし、csv ファイルの内容の一部をデータベースに保存する PHP スクリプトがあります。約 40 kb、約 100 行のファイルを使用すると、スクリプトのすべてが正常に機能します。しかし、850 kb 以上の同様の構造化ファイルをアップロードしようとすると、次のエラー メッセージが表示されます。
配列 ( [タイプ] => 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_filesize
、memory_limit
、およびpost_max_size
変数を手動で設定しました。それが問題かもしれないと思ったからです...しかし、何も変わっていないようです。この問題の助けをいただければ幸いです。このスクリプトでBIGファイルをアップロードできるようにしたいと考えています。:-)
** 編集 **
このスクリプトは、ファイルが十分に小さい場合にうまく機能することに注意してください。小さなファイル (100 行) でもう一度試してみましたが、うまくいきました。& を 10 行目から削除したところ、より大きなファイルを試したときに次のエラーが発生しました。
配列 ( [タイプ] => 2048 [メッセージ] => 変数のみ参照によって割り当てられる必要があります [ファイル] => /home/dir_name/plugins/content/jw_simpleImageGallery/jw_simpleImageGallery.php [行] => 32 )
このエラーは、error_get_last
28 行目の関数によってスローされています。これは、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 必要であることが判明したため、この値を増やすと、より大きなファイルが機能しました... :-/