想找教程的朋友请查阅死亡之书,学习基础教程之前请先看下PHP基本符号,帮助了解。本教程适合有一点语言常识的人看,无基础也可,学习PHP贵在坚持,重在实践,学到的东西要经常拿出来写,别人教的代码即使不懂什么意思也要写到面熟为止,有什么问题尽管留言给我,能帮忙解决的小弟第一时间处理,再一次感谢大家的光临!(注意:打开某些文章会有帐号密码输入框,大家直接点取消就好了,想要看图片的,我会尽快把图片连接修改掉的.)

PHP入门(进阶提升)之上传文件

上一篇 / 下一篇  2006-11-23 07:52:40 / 个人分类:PHP学习经验

上传的工作原理第 1 页(共5 页)


除了文本信息外,还可以使用 HTML 表单发送文档,这正是用户能够向系统增加文件的原因。具体的过程如下:

  1. 用户加载使其能够选择上传文件的表单。
  2. 用户提交表单。
  3. 浏览器把文件和关于文件的信息作为请求的一部分发送给服务器。
  4. 服务器把文件保存在临时存储位置。
  5. 处理表单提交的 PHP 页面将文件从临时位置转移到持久存储位置。

我们首先创建一个具体的表单。

上传表单第 2 页(共5 页)


用于上传文件的表单和用于注册与登录页面的表单类似,有两个重要的区别:

<?php
   include("top.txt");
?>

<h3>Upload a file</h3>

<p>You can add files to the system for review by an administrator.
Click <b>Browse</b> to select the file you'd like to upload, 
and then click <b>Upload</b>.</p>

<form action="uploadfile_action.php" method="POST"enctype="multipart/form-data">
<input type="file" name="ufile" \><input type="submit" value="Upload" \>
</form>

<?php
   include("bottom.txt");
?>

enctype属性告诉浏览器,发送的信息必须使用一种特殊的格式,这种格式允许包含多个部分的信息,而不仅仅是一串名值对。

文件输入提供了一个文本框,允许用户单击浏览...来选择文件,如图 4 所示。

图 4. 选择上传文件
选择上传文件

注意该文件uploadfile.php的链接已经添加到top.txt页中,因此出现在浏览器中。

上传信息第 3 页(共5 页)


通过浏览器上传文件时,PHP 收到关于该文件的信息数组。这些信息可以在$_FILE数组中根据输入字段的名字找到。比如,如果表单中的文件输入框名字为ufile,那么关于该文件的所有信息都包含在数组$_FILE['ufile']

该数组允许用户上传多个文件。只要每个文件有自己的名称,就会有自己的数组。

要注意,我们把“$_FILE”称为数组。本系列教程的 第 1 部分中,您已经遇到这样的情况:对口令用同一个名称传递多个表单值时,一个数组值本身是另一个数组。在这里,每个$_FILE数组本身都是关联数组。比如,ufile 文件包含以下信息:

  • $_FILE['ufile']['name']——文件名(如 uploadme.txt)
  • $_FILE['ufile']['type']——文件类型(如image/jpg
  • $_FILE['ufile']['size']——上传文件的大小,按字节计算
  • $_FILE['ufile']['tmp_name']——上传文件在服务器上的临时名称和位置
  • $_FILE['ufile']['error']——如果有的话,表示上传过程中产生的错误码

知道了应该具备的信息,就可以在处理之前检查文件是否真的上传了。

保存文件第 5 页(共5 页)


开始保存上传文件的过程之前,需要确定将它放在哪儿。除非该文件已经批准,否则您不希望从网站上访问它,因此要创建一个不在主文档根中的目录。

这里使用 /var/www/hidden/,这就是所有文件都要去的地方,因此定义一个常量是不错的办法。打开 scrīpts.txt 增加如下定义:

...
  mysql_select_db($db);

}
   define(UPLOADEDFILES, "/var/www/hidden/");
?>

只要把 scrīpts.txt 包含在上传页中就可使用该定义了:

<?php
   include("top.txt");
   include("scrīpts.txt");

   if(isset($_FILES['ufile']['name'])){
       echo "Uploading: ".$_FILES['ufile']['name']."<br>";

       $tmpName = $_FILES['ufile']['tmp_name']; 
       $newName = UPLOADEDFILES . $_FILES['ufile']['name'];  

       if(!is_uploaded_file($tmpName) ||
                            !move_uploaded_file($tmpName, $newName)){
            echo "FAILED TO UPLOAD " . $_FILES['ufile']['name'] .
                 "<br>Temporary Name: $tmpName <br>";
       } else {
            echo "File uploaded.  Thank you!";
       } 

   } else {
     echo "You need to select a file.  Please try again.";
  }
   include("bottom.txt");
?>

首先获得文件的当前位置和临时名称(tmp_name),并使用定义的常量确定要存放的位置。

接下来,就是在 if-then 语句中,做了两件事。首先检查要移动的文件是否确实是上传到服务器上的文件,而不是用户诱使我们作出反应的 /etc/passwd 这类文件。如果is_uploaded_file()函数返回 false,则它的反!is_uploaded_file()就是 true,于是 PHP 显示错误消息。

另一方面,如果测试返回 true,则意味着是确实是上传的文件,然后可以将它从当前位置转移到新的位置。如果移动不成功,则返回 false,同样取反后为 true,于是显示错误消息。

换句话说,如果不是上传文件或者不能移动,就显示错误消息。否则显示移动成功的消息(参见图 5)。

图 5. 转移成功的消息
转移成功的消息

现在已经得到了上传的文件,还需要记录相关的信息以便日后检索。


TAG: PHP 文件上传 上传文件 PHP学习经验

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的存档

数据统计

  • 访问量: 4176
  • 日志数: 12
  • 建立时间: 2006-11-23
  • 更新时间: 2006-11-23

RSS订阅

Open Toolbar