PHP文件上传功能由俩个部分组成,HTML页面和PHP处理部分,HTML页面主要让用户选中要上传的文件,PHP部分让我们可以把文件存储到服务器的指定目录。
HTML部分
代码语言:javascript复制 <form method="post" action="upload_file.php" enctype="multipart/form-data">
<label for="file">文件:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="上传" />
</form>
在上传文件的表单中,表单必须设置 enctype="multipart/form-data"
来告诉服务器上传的文件中带有常规表单信息。
而<input>
标签的 type="file"
属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个选择文件按钮。
PHP部分
代码语言:javascript复制<!-- 上传脚本 -->
<?php
// 允许上传的图片类型
$allowedExts = array("gif", "jpeg", "jpg", "png");
// 获取文件后缀名
$temp = explode(".", $_FILES["file"]["name"]); //输出:Array ( [0] => deer [1] => jpg )
$extension = end($temp);
// 文件类型判断 文件大小判断 后缀名匹配判断
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts)
) {
if ($_FILES["file"]["error"] > 0) {
echo "错误:: " . $_FILES["file"]["error"] . "<br>";
} else {
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
// 判断当前目录下是否存在该文件
if (file_exists("upload/" . $_FILES["file"]["name"])) {
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
} else { // 如果没有该目录,创建目录
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
}
}
} else {
echo "非法的文件格式";
}
重命名文件
随机字符串
预置一个的字符串$chars ,包括 a–z,A–Z,0–9,以及一些特殊字符,生成固定长度的随机字符串。
代码语言:javascript复制function random($length) {
$file_name = 'CR-';
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
$max = strlen($chars) - 1;
mt_srand((double)microtime() * 1000000);
for($i = 0; $i < $length; $i ) {
//取字符数组 $chars 的任意元素
$file_name .= $chars[mt_rand(0, $max)];
//使用 substr 截取$chars中的任意一位字符
//$file_name .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
}
return $file_name;
}
此时的PHP代码如下:
代码语言:javascript复制<!-- 上传脚本 -->
<?php
// 允许上传的图片类型
$allowedExts = array("gif", "jpeg", "jpg", "png");
// 获取文件后缀名
$temp = explode(".", $_FILES["file"]["name"]); //输出:Array ( [0] => deer [1] => jpg )
$extension = end($temp);
// 文件类型判断 文件大小判断 后缀名匹配判断
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts)
) {
if ($_FILES["file"]["error"] > 0) {
echo "错误:: " . $_FILES["file"]["error"] . "<br>";
} else {
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
// 判断当前目录下是否存在该文件
if (file_exists("upload/" . $_FILES["file"]["name"])) {
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
} else {
// 调用随机字符串生成随机文件名
$new_filename = random(10) . '.';
// 在移动上传文件时,直接使用move_uploaded_file()函数更改文件名。
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $new_filename . $extension);
echo "文件存储在: " . "upload/" . $new_filename . $extension;
}
}
} else {
echo "非法的文件格式";
}
// 随机字符串命名函数
function random($length)
{
$file_name = 'CR-';
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
$max = strlen($chars) - 1;
mt_srand((float)microtime() * 1000000);
for ($i = 0; $i < $length; $i ) {
//取字符数组 $chars 的任意元素
$file_name .= $chars[mt_rand(0, $max)];
//使用 substr 截取$chars中的任意一位字符
//$file_name .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
}
return $file_name;
}
时间戳命名
php本身没有提供返回毫秒数的函数,但提供了microtime()方法,它会返回一个数组,包含两个元素:一个是秒数、一个是小数表示的毫秒数,我们可以通过如下方法获取返回的毫秒数:
代码语言:javascript复制 function getMillisecond() {
list($t1, $t2) = explode(' ', microtime());
return (float)sprintf('%.0f', (floatval($t1) floatval($t2)) * 1000);
}
echo getMillisecond();
完整代码如下:
代码语言:javascript复制<!-- 上传脚本 -->
<?php
// 允许上传的图片类型
$allowedExts = array("gif", "jpeg", "jpg", "png");
// 获取文件后缀名
$temp = explode(".", $_FILES["file"]["name"]); //输出:Array ( [0] => deer [1] => jpg )
$extension = end($temp);
// 文件类型判断 文件大小判断 后缀名匹配判断
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts)
) {
if ($_FILES["file"]["error"] > 0) {
echo "错误:: " . $_FILES["file"]["error"] . "<br>";
} else {
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
// 判断当前目录下是否存在该文件
if (file_exists("upload/" . $_FILES["file"]["name"])) {
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
} else {
// 调用时间戳生成随机文件名
$new_filename = getMillisecond() . '.';
// 在移动上传文件时,直接使用move_uploaded_file()函数更改文件名。
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $new_filename . $extension);
echo "文件存储在: " . "upload/" . $new_filename . $extension;
}
}
} else {
echo "非法的文件格式";
}
// 获取时间戳
function getMillisecond()
{
list($t1, $t2) = explode(' ', microtime());
return (float)sprintf('%.0f', (floatval($t1) floatval($t2)) * 1000);
}
保存文件路径到数据库
首先,给form表单添加 enctype="multipart/form-data"
并给上传文件的input
标签添加name
值
<input type="file" class="form-control" name="img_file">
然后在PHP处理文件中进行处理
代码语言:javascript复制// 允许上传的图片类型
$allowedExts = array("gif", "jpeg", "jpg", "png");
// 获取文件后缀名
$temp = explode(".", $_FILES["img_file"]["name"]); //输出:Array ( [0] => deer [1] => jpg )
$extension = end($temp);
// 文件类型判断 文件大小判断 后缀名匹配判断
if ((($_FILES["img_file"]["type"] == "image/gif")
|| ($_FILES["img_file"]["type"] == "image/jpeg")
|| ($_FILES["img_file"]["type"] == "image/jpg")
|| ($_FILES["img_file"]["type"] == "image/pjpeg")
|| ($_FILES["img_file"]["type"] == "image/x-png")
|| ($_FILES["img_file"]["type"] == "image/png"))
&& ($_FILES["img_file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts)
) {
if ($_FILES["img_file"]["error"] > 0) {
echo "错误:: " . $_FILES["img_file"]["error"] . "<br>";
} else {
if (file_exists("../upload/" . $_FILES["img_file"]["name"])) {
$icon_file = $_FILES["img_file"]["name"];
} else {
// 调用时间戳生成随机文件名
$new_filename = getMillisecond() . '.';
// 在移动上传文件时,直接使用move_uploaded_file()函数更改文件名。
move_uploaded_file($_FILES["img_file"]["tmp_name"], "../upload/" . $new_filename . $extension);
// 获取到文件的路径并赋值给$img_file
$img_file = "../upload/" . $new_filename . $extension;
}
}
} else {
echo "非法的文件格式";
}
// 获取时间戳
function getMillisecond()
{
list($t1, $t2) = explode(' ', microtime());
return (float)sprintf('%.0f', (floatval($t1) floatval($t2)) * 1000);
}
此时得到的文件路径为变量:$img_file
然后在数据库语句中引用即可。