// 基础格式
$FILES = [
'name' => '文件名'
'type' => '文件类型'
'tmp_name' => '文件被上传后在服务端储存的临时文件名'
'error' => '错误类型号'
'size' => '已上传文件的大小'
]
<form action="" method="post" enctype="multipart/form-data">
<p>Pictures:
<input type="file" name="pic" />
<input type="submit" value="Send" />
p>
form>
// 一个文件上传
Array
(
[pic] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 4
[size] => 0
)
)
<form action="" method="post" enctype="multipart/form-data">
<p>Pictures:
<input type="file" name="pics[]" />
<input type="file" name="pic[]" />
<input type="file" name="pics[]" />
<input type="submit" value="Send" />
p>
form>
// 多个文件上传
Array
(
Array
(
[pics] => Array
(
[name] => Array
(
[0] => test.gif
[1] => test.mp4
)
[type] => Array
(
[0] => image/gif
[1] => video/mp4
)
[tmp_name] => Array
(
[0] => D:\wamp64\tmp\php8E02.tmp
[1] => D:\wamp64\tmp\php8E04.tmp
)
[error] => Array
(
[0] => 0
[1] => 0
)
[size] => Array
(
[0] => 0
[1] => 0
)
)
[pic] => Array
(
[name] => Array
(
[0] => test.jpg
)
[type] => Array
(
[0] => image/jpeg
)
[tmp_name] => Array
(
[0] => D:\wamp64\tmp\php8E03.tmp
)
[error] => Array
(
[0] => 0
)
[size] => Array
(
[0] => 4544
)
)
)
$_FILES[‘file’][‘error’] === 0 代表成功上传
UPLOAD_ERR_OK // 其值为 0,没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE // 其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE // 其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL // 其值为 3,文件只有部分被上传。
UPLOAD_ERR_NO_FILE // 其值为 4,没有文件被上传。
UPLOAD_ERR_NO_TMP_DIR // 其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
UPLOAD_ERR_CANT_WRITE // 其值为 7,文件写入失败。PHP 5.1.0 引进。
// 可以将其封装进异常
class FileUploadException extend \Exception
{
public function __construct($code){
$messge = self::_codeToMessage($code);
parent::__construct($message, $code);
}
private function _codeToMessage($code){
switch ($code){
case UPLOAD_ERR_INI_SIZE:
$message = '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的';
break;
case UPLOAD_ERR_FORM_SIZE:
$message = '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';
break;
case UPLOAD_ERR_PARTIAL:
$message = '文件只有部分被上传';
break;
case UPLOAD_ERR_NO_FILE:
$message = '没有文件被上传';
break;
case UPLOAD_ERR_NO_TMP_DIR:
$message = '服务器错误,找不到临时文件夹';
break;
case UPLOAD_ERR_CANT_WRITE:
$message = '服务器错误,文件写入失败';
break;
}
}
}
// use
if (!$_FILES['file']['error'] === UPLOAD_ERR_OK){
throw new FileUploadException($_FILES['file']['error'])
}
// 为啥不写数值,写常量名
// 以上常量值在是 PHP==4.3.0才引入的,PHP < 4.3.0则没有用
为什么需要临时文件$FILES[‘file’][‘tmp_name’]作为中转呢?
自我认为 php把其封装为$_FILE,有临时文件,用户就可以用代码控制其去向,毕竟PHP不知道你要把图片保存到哪里的。
你不用$_FILES来传文件的话,也可自己封装,比如base64编码传图
前端把图片按base64编码绑定到参数$_POST[‘file’]
$image_str = $POST['file']
$image = base64_decode($image_str)
$unique_file_name = tempnam('/tmp', '_face') // 文件名前缀固定_face,且唯一
if (file_put_contents($unique_file_name, $image) === false){
echo '写入临时文件失败';
return false;
}
// 真正要上传的目录 /uploads
if (move_upload_file($unique_file_name, '/upload') === false){
echo '移动失败;
return false;
}
if ($POST['file']){
if(unlink($unique_file_name) === false){
echo '大哥,我删除不了临时文件了';
return false;
}
}
return true;
// 文件上传错误信息
private $error = '';
// 当前完整文件名 临时文件名
protected $filename;
// 上传文件名
protected $saveName;
// 文件上传命名规则 默认日期
protected $rule = 'date';
// 文件上传验证规则
protected $validate = [];
// 单元测试
protected $isTest;
// 上传文件信息 $_FILES['file']数组
protected $info;
// 文件hash信息
protected $hash = [];
(
0 => array(
'error' => '',
'filename' => '/tmp/phpc5SlBm',
'saveName' => NULL,
'rule' => 'date',
'validate' =>
array (
),
'isTest' => NULL,
'info' =>
array (
'key' => 'file',
'name' => '批量创建计划模板.xls',
'type' => 'application/vnd.ms-excel',
'tmp_name' => '/tmp/phpc5SlBm',
'error' => 0,
'size' => 29696,
),
'hash' =>
array (
),
),
1 => array(
'error' => '',
'filename' => '/tmp/phpT9Q87l',
'saveName' => NULL,
'rule' => 'date',
'validate' =>
array (
),
'isTest' => NULL,
'info' =>
array (
'key' => 'file',
'name' => '批量创建计划模板.xls',
'type' => 'application/vnd.ms-excel',
'tmp_name' => '/tmp/phpT9Q87l',
'error' => 0,
'size' => 29696,
),
'hash' =>
array (
),
)
)