一直抛出'invalid file'异常,问题出在哪里?
Keeps throwing 'invalid file' exception, where lays the issue?
我在尝试验证要上传的文件时遇到此代码段的问题。代码来自 this page,但是当我检查 mime 类型时它一直抛出 Invalid file format.
异常。我只需要上传 PDF 文件。我尝试过的每个 PDF 文件都失败了。
这可能是什么问题?
private function File($f) { // example from http://php.net/manual/en/features.file-upload.php
try {
if(!isset($f['file']['error']) || is_array($f['file']['error'])) {
throw new RuntimeException('Invalid parameters.');
}
switch ($f['file']['error']) {
case UPLOAD_ERR_OK:
break;
case UPLOAD_ERR_NO_FILE:
throw new RuntimeException('No file sent.');
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
throw new RuntimeException('Exceeded filesize limit.');
default:
throw new RuntimeException('Unknown errors.');
}
if($f['file']['size'] > 10000000) {
throw new RuntimeException('Exceeded filesize limit.');
}
$finfo = new finfo(FILEINFO_MIME_TYPE);
$extentions = array(
'pdf' => 'application/pdf',
'pdf' => 'x-pdf',
'pdf' => 'application/vnd.cups-pdf',
'pdf' => 'application/vnd.sealedmedia.softseal-pdf'
);
$ext = array_search($finfo->file($f['file']['tmp_name']), $extentions);
if(false === $ext) {
throw new RuntimeException('Invalid file format.');
}
if(!move_uploaded_file($f['file']['tmp_name'], sprintf('./uploads/%s.%s', sha1_file($f['file']['tmp_name']), $ext))) {
throw new RuntimeException('Failed to move uploaded file.');
}
echo 'File is uploaded successfully.';
}
catch (RuntimeException $e) {
echo $e->getMessage();
}
}
一个问题是:我相信你的键和值被交换了。在下面,将有一个名为 $extensions
的数组,其中一个键 pdf
与一个值 application/vnd.sealedmedia.softseal-pdf
相关联
$extentions = array(
'pdf' => 'application/pdf',
'pdf' => 'x-pdf',
'pdf' => 'application/vnd.cups-pdf',
'pdf' => 'application/vnd.sealedmedia.softseal-pdf'
);
我怀疑您实际上是在尝试这样做:
$extentions = array(
'application/pdf' => 'pdf',
'x-pdf' => 'pdf',
'application/vnd.cups-pdf' => 'pdf',
'application/vnd.sealedmedia.softseal-pdf' => 'pdf'
);
$ext = @$extensions[$finfo->file($f['file']['tmp_name'])];
您正在用新值覆盖 $extentions
中的数组键,而不是添加新的 key/value 对。
以下代码与您的想法不符:
$extentions = array(
'pdf' => 'application/pdf',
'pdf' => 'x-pdf',
'pdf' => 'application/vnd.cups-pdf',
'pdf' => 'application/vnd.sealedmedia.softseal-pdf'
);
A var_dump($extentions);
将产生:
array(1) {
["pdf"]=>
string(40) "application/vnd.sealedmedia.softseal-pdf"
}
您需要添加其他 MIME 类型,而不是覆盖它们。
我在尝试验证要上传的文件时遇到此代码段的问题。代码来自 this page,但是当我检查 mime 类型时它一直抛出 Invalid file format.
异常。我只需要上传 PDF 文件。我尝试过的每个 PDF 文件都失败了。
这可能是什么问题?
private function File($f) { // example from http://php.net/manual/en/features.file-upload.php
try {
if(!isset($f['file']['error']) || is_array($f['file']['error'])) {
throw new RuntimeException('Invalid parameters.');
}
switch ($f['file']['error']) {
case UPLOAD_ERR_OK:
break;
case UPLOAD_ERR_NO_FILE:
throw new RuntimeException('No file sent.');
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
throw new RuntimeException('Exceeded filesize limit.');
default:
throw new RuntimeException('Unknown errors.');
}
if($f['file']['size'] > 10000000) {
throw new RuntimeException('Exceeded filesize limit.');
}
$finfo = new finfo(FILEINFO_MIME_TYPE);
$extentions = array(
'pdf' => 'application/pdf',
'pdf' => 'x-pdf',
'pdf' => 'application/vnd.cups-pdf',
'pdf' => 'application/vnd.sealedmedia.softseal-pdf'
);
$ext = array_search($finfo->file($f['file']['tmp_name']), $extentions);
if(false === $ext) {
throw new RuntimeException('Invalid file format.');
}
if(!move_uploaded_file($f['file']['tmp_name'], sprintf('./uploads/%s.%s', sha1_file($f['file']['tmp_name']), $ext))) {
throw new RuntimeException('Failed to move uploaded file.');
}
echo 'File is uploaded successfully.';
}
catch (RuntimeException $e) {
echo $e->getMessage();
}
}
一个问题是:我相信你的键和值被交换了。在下面,将有一个名为 $extensions
的数组,其中一个键 pdf
与一个值 application/vnd.sealedmedia.softseal-pdf
$extentions = array(
'pdf' => 'application/pdf',
'pdf' => 'x-pdf',
'pdf' => 'application/vnd.cups-pdf',
'pdf' => 'application/vnd.sealedmedia.softseal-pdf'
);
我怀疑您实际上是在尝试这样做:
$extentions = array(
'application/pdf' => 'pdf',
'x-pdf' => 'pdf',
'application/vnd.cups-pdf' => 'pdf',
'application/vnd.sealedmedia.softseal-pdf' => 'pdf'
);
$ext = @$extensions[$finfo->file($f['file']['tmp_name'])];
您正在用新值覆盖 $extentions
中的数组键,而不是添加新的 key/value 对。
以下代码与您的想法不符:
$extentions = array(
'pdf' => 'application/pdf',
'pdf' => 'x-pdf',
'pdf' => 'application/vnd.cups-pdf',
'pdf' => 'application/vnd.sealedmedia.softseal-pdf'
);
A var_dump($extentions);
将产生:
array(1) {
["pdf"]=>
string(40) "application/vnd.sealedmedia.softseal-pdf"
}
您需要添加其他 MIME 类型,而不是覆盖它们。