スプレッドシートをアップロードし、PHPExcelを使用してMySQLデータベースに読み込もうとしています。
.xlsxファイルの場合は正常に機能しますが、.odsファイルをアップロードしようとすると、エラーがスローされます:PHP致命的なエラー:PHPExcel_1の非オブジェクトでメンバー関数getNamespaces()を呼び出す.7.9/Classes/PHPExcel/Reader/OOCalc.php(341行目)
何が問題なのですか?
HTMLフォーム:
<form method="post" enctype="multipart/form-data">
Upload File: <input type="file" name="spreadsheet"/>
<input type="submit" name="submit" value="Submit" />
</form>
PHP(同じファイル内):
//Check valid spreadsheet has been uploaded
if(isset($_FILES['spreadsheet'])){
if($_FILES['spreadsheet']['name']){
if(!$_FILES['spreadsheet']['error'])
{
$inputFile = $_FILES['spreadsheet']['name'];
$extension = strtoupper(pathinfo($inputFile, PATHINFO_EXTENSION));
if($extension == 'XLSX' || $extension == 'ODS'){
//Read spreadsheeet workbook
try {
$inputFile = $_FILES['spreadsheet']['tmp_name'];
$inputFileType = PHPExcel_IOFactory::identify($inputFile);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFile);
} catch(Exception $e) {
die($e->getMessage());
}
//Get worksheet dimensions
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
//Loop through each row of the worksheet in turn
for ($row = 1; $row <= $highestRow; $row++){
// Read a row of data into an array
$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
//Insert into database
}
}
else{
echo "Please upload an XLSX or ODS file";
}
}
else{
echo $_FILES['spreadsheet']['error'];
}
}
}
?>
ファイルがWebサーバーにアップロードされると、ファイルはランダムな名前でシステムの一時フォルダーに保存されます。
あなたがやろうとしていたのは、アップロードしたファイルの実際のname
を与えることでしたが、ファイルはtmpフォルダーにランダムな名前で作成されたためです。代わりにtmp_name
を使用する必要があります。これは、実際にはそのランダムな名前のファイルを指します。
また、name
にはアップロードされたファイルの名前のみがあり、パスはありませんが、tmp_name
を使用すると、ファイルへの実際のパスがあります。
次のファイルアップロードの例を参照してください。
array(
[UploadFieldName]=>array(
[name] => MyFile.jpg
[type] => image/jpeg
[tmp_name] => /tmp/php/php6hst32
[error] => UPLOAD_ERR_OK
[size] => 98174
)
)
代わりにコードをこれに変更してください
//Check valid spreadsheet has been uploaded
if(isset($_FILES['spreadsheet'])){
if($_FILES['spreadsheet']['tmp_name']){
if(!$_FILES['spreadsheet']['error'])
{
$inputFile = $_FILES['spreadsheet']['tmp_name'];
$extension = strtoupper(pathinfo($inputFile, PATHINFO_EXTENSION));
if($extension == 'XLSX' || $extension == 'ODS'){
//Read spreadsheeet workbook
try {
$inputFileType = PHPExcel_IOFactory::identify($inputFile);
$objReader = PHPExcel_IOFactory::createReader($inputFileType);
$objPHPExcel = $objReader->load($inputFile);
} catch(Exception $e) {
die($e->getMessage());
}
//Get worksheet dimensions
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
//Loop through each row of the worksheet in turn
for ($row = 1; $row <= $highestRow; $row++){
// Read a row of data into an array
$rowData = $sheet->rangeToArray('A' . $row . ':' . $highestColumn . $row, NULL, TRUE, FALSE);
//Insert into database
}
}
else{
echo "Please upload an XLSX or ODS file";
}
}
else{
echo $_FILES['spreadsheet']['error'];
}
}
}
?>
私の場合、この行の拡張子の検出中にエラーが発生しました
$extension = strtoupper(pathinfo($inputFile, PATHINFO_EXTENSION));
解決する必要がある場合は、nameパラメーターから確認してください
$extension = strtoupper(explode(".", $_FILES['spreadsheet']['name'])[1]);
残りは働いていますありがとう:)