PHP 文件上传
来源:互联网 发布:网络机房存储设备 编辑:程序博客网 时间:2024/06/16 07:13
这里使用PHP实现文件的上传,由在浏览器这边选择文件,上传到服务器。其中,在上传文件中,考虑到对上传文件大小的限制、类型限制等问题。(当然可以根据我们需要修改对上传的文件的限制,而一般而言PHP自身也同样对将要上传的文件大小进行了限制,默认为2M,也就是说我们不能上传太大的图片。)这里我们限制用户只能上传jpg格式的图片,此外,图片大小不能超过2M。
文件上传界面 upload.php
提交含上传文件的表单时,表单form需要设置enctype属性:
- <form action=”” enctype="multipart/form-data" method=”post”>
- 上传文件<input type=”file” name=”myfile”/>
- <input type=”submit” value=”上传”/>
- </form>
- <form action=”” enctype="multipart/form-data" method=”post”>
- 上传文件<input type=”file” name=”myfile”/>
- <input type=”submit” value=”上传”/>
- </form>
具体代码如下:
- <html>
- <head>
- <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
- <title>上传你的File吧</title>
- </head>
- <form enctype="multipart/form-data" method="post" action="uploadprocess.php">
- <table>
- <tr><td align="center" colspan="2"><font style="font-size:40px;font-family: 华文彩云;">文件上传</font></td></tr>
- <tr><td>请填写用户名:</td><td><input type="text" name="username"/></td></tr>
- <tr><td>请简单介绍该文件</td><td><textarea name="fileintro" rows="10" cols="80"></textarea></td></tr>
- <tr><td>请选择你要上传文件:</td><td><input type="file" name="myfile"/></td></tr>
- <tr><td><input type="submit" value="上传文件"/></td><td></td></tr>
- </table>
- </form>
- </html>
- <html>
- <head>
- <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
- <title>上传你的File吧</title>
- </head>
- <form enctype="multipart/form-data" method="post" action="uploadprocess.php">
- <table>
- <tr><td align="center" colspan="2"><font style="font-size:40px;font-family: 华文彩云;">文件上传</font></td></tr>
- <tr><td>请填写用户名:</td><td><input type="text" name="username"/></td></tr>
- <tr><td>请简单介绍该文件</td><td><textarea name="fileintro" rows="10" cols="80"></textarea></td></tr>
- <tr><td>请选择你要上传文件:</td><td><input type="file" name="myfile"/></td></tr>
- <tr><td><input type="submit" value="上传文件"/></td><td></td></tr>
- </table>
- </form>
- </html>
上传文件的处理 uploadprocess.php
- <?php
-
- $username=$_POST['username'];
- $fileintro=$_POST['fileintro'];
-
-
-
-
-
-
-
-
-
-
-
- $file_size=$_FILES['myfile']['size'];
- if($file_size>2*1024*1024) {
- echo "文件过大,不能上传大于2M的文件";
- exit();
- }
-
- $file_type=$_FILES['myfile']['type'];
- echo $file_type;
- if($file_type!="image/jpeg" && $file_type!='image/pjpeg') {
- echo "文件类型只能为jpg格式";
- exit();
- }
-
-
-
- if(is_uploaded_file($_FILES['myfile']['tmp_name'])) {
-
- $uploaded_file=$_FILES['myfile']['tmp_name'];
-
-
- $user_path=$_SERVER['DOCUMENT_ROOT']."/studyphp/file/up/".$username;
-
- if(!file_exists($user_path)) {
- mkdir($user_path);
- }
-
-
- $file_true_name=$_FILES['myfile']['name'];
- $move_to_file=$user_path."/".time().rand(1,1000).substr($file_true_name,strrpos($file_true_name,"."));
-
- if(move_uploaded_file($uploaded_file,iconv("utf-8","gb2312",$move_to_file))) {
- echo $_FILES['myfile']['name']."上传成功";
- } else {
- echo "上传失败";
- }
- } else {
- echo "上传失败";
- }
-
- ?>
- <?php
-
- $username=$_POST['username'];
- $fileintro=$_POST['fileintro'];
-
-
-
-
-
-
-
-
-
-
-
- $file_size=$_FILES['myfile']['size'];
- if($file_size>2*1024*1024) {
- echo "文件过大,不能上传大于2M的文件";
- exit();
- }
-
- $file_type=$_FILES['myfile']['type'];
- echo $file_type;
- if($file_type!="image/jpeg" && $file_type!='image/pjpeg') {
- echo "文件类型只能为jpg格式";
- exit();
- }
-
-
-
- if(is_uploaded_file($_FILES['myfile']['tmp_name'])) {
-
- $uploaded_file=$_FILES['myfile']['tmp_name'];
-
-
- $user_path=$_SERVER['DOCUMENT_ROOT']."/studyphp/file/up/".$username;
-
- if(!file_exists($user_path)) {
- mkdir($user_path);
- }
-
-
- $file_true_name=$_FILES['myfile']['name'];
- $move_to_file=$user_path."/".time().rand(1,1000).substr($file_true_name,strrpos($file_true_name,"."));
-
- if(move_uploaded_file($uploaded_file,iconv("utf-8","gb2312",$move_to_file))) {
- echo $_FILES['myfile']['name']."上传成功";
- } else {
- echo "上传失败";
- }
- } else {
- echo "上传失败";
- }
-
- ?>
上传文件需要考虑到如下细节:
(1)如何控制用户上传文件的大小 < 2M
-
- $file_size=$_FILES['myfile']['size'];
- if($file_size>2*1024*1024) {
- echo "文件过大,不能上传大于2M的文件";
- exit();
- }
-
- $file_size=$_FILES['myfile']['size'];
- if($file_size>2*1024*1024) {
- echo "文件过大,不能上传大于2M的文件";
- exit();
- }
(2)如何控制用户上传的文件类型- $file_type=$_FILES['myfile']['type'];
- echo $file_type;
- if($file_type!="image/jpeg" && $file_type!='image/pjpeg') {
- echo "文件类型只能为jpg格式";
- exit();
- }
- $file_type=$_FILES['myfile']['type'];
- echo $file_type;
- if($file_type!="image/jpeg" && $file_type!='image/pjpeg') {
- echo "文件类型只能为jpg格式";
- exit();
- }
(3)如何防止用户图片覆盖问题-
- $uploaded_file=$_FILES['myfile']['tmp_name'];
-
-
- $user_path=$_SERVER['DOCUMENT_ROOT']."/studyphp/file/up/".$username;
-
- if(!file_exists($user_path)) {
- mkdir($user_path);
- }
-
- $uploaded_file=$_FILES['myfile']['tmp_name'];
-
-
- $user_path=$_SERVER['DOCUMENT_ROOT']."/studyphp/file/up/".$username;
-
- if(!file_exists($user_path)) {
- mkdir($user_path);
- }
为了防止不同用户上传的图片文件名相同导致图片被覆盖的问题,我们只要为不同用户创建一个文件夹就行了,不同用户上传的文件存储在不同文件夹中。(4)如何防止同一个用户的文件名相同的问题
- $file_true_name=$_FILES['myfile']['name'];
- $move_to_file=$user_path."/".time().rand(1,1000).substr($file_true_name,strrpos($file_true_name,"."));
- $file_true_name=$_FILES['myfile']['name'];
- $move_to_file=$user_path."/".time().rand(1,1000).substr($file_true_name,strrpos($file_true_name,"."));
上面我们解决了不同用户图片覆盖的问题,但是如果同一用户上传了同一文件名不同文件内容的图片时,同样也会发生文件覆盖的问题,我们只需从C:\windows\Temp目录中上传的文件转移到服务器真正要存储的目录时将原文件名进行修改即可,而修改后的名字跟其他文件重名的几率很低,修改后的名字由上传文件的时间秒数和随机数组成。