a
请求类型必须是POST
, 数据编码类型必须是: 复合表单数据,让服务器知道上传的是文件
隐藏域:限制上传文件大小, 不超过php.ini: upload_max_filesize
值
有关上面的 HTML 表单的一些注意项列举如下:
<form>
标签的 enctype
属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 multipart/form-data
。<input>
标签的 type="file"
属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
Form表单
<form action="demo1.php" method="post" enctype="multipart/form-data">
<input type="file" name="my_file" id="">
<input type="hidden" name="MAX_FILE_SIZE" value="3145728">
<button>上传</button>
</form>
文件上传
$_FILES
数组内容如下:
$_FILES['my_File']['name']
客户端文件的原名称。
$_FILES['my_File']['type']
文件的 MIME 类型,需要浏览器提供该信息的支持,例如”image/gif”。
$_FILES['my_File']['tmp_name']
文件被上传后在服务端储存的临时文件名
$_FILES['my_file']['error']
判断上传是否成功、错误类型
// 后端PHP主要使用超全局变量: $_FILES 来处理上传的文件
if (!isset($_FILES['my_file'])) {
echo ' 没有文件被上传';
exit;
}
// 1. 配置上传参数
// 设置允许上传的文件类型
$fileType = ['jpg', 'jpeg', 'png', 'gif'];
// 设置允许上传的最大文件长度
$fileSize = 3145728;
// 上传到服务器上指定的目录
$filePath = '/uploads/';
// 上传的原始文件名
$fileName = $_FILES['my_file']['name'];
// 上传保存在服务器上的临时文件名
$tempFile = $_FILES['my_file']['tmp_name'];
// 3. 判断上传是否成功?
// 主要是通过$_FILES['my_file']['error']值, 等于0成或,大于1出错,出错类型用switch分析
$uploadError = $_FILES['my_file']['error'];
if ($uploadError > 0) {
switch ($uploadError) {
case 1:
case 2: die('上传文件不允许超过3M');
case 3: die('上传文件不完整');
case 4: die('没有文件被上传');
default: die('未知错误');
}
}
// 3. 判断文件扩展名是否正确?
$extension = explode('.',$fileName)[1];
if (!in_array($extension, $fileType)) {
die('不允许上传' . $extension . '文件类型');
}
// 4. 为了防止同名文件相互覆盖, 应该将上传到指定目录的文件重命名,例如用md5+时间戳
$fileName = date('YmdHis',time()).md5(mt_rand(1,99)) . '.' . $extension;
// 5. 判断文件是否上传成功?
if (is_uploaded_file($tempFile)) {
if (move_uploaded_file($tempFile, __DIR__ . $filePath.$fileName)) {
// 提示用户上成功
echo '上传成功';
} else {
die('文件无法移动到指定目录,请检查目录权限');
}
} else {
die('非法操作');
}
exit();
`