澳门新浦京8455comPHP中的表单应用释疑

澳门新浦京8455com,在WebDev站点上经常看到的一个问题是关于文件上传的。在这篇文章里我将解释如何用PHP实现文件上传。
设计上传表格
我们主要的目标是完成文件从本地计算机上传到服务器上去。为了做到这一点,我们需要做一个表格,允许用户选择一个文件并可以提交它。下面是一个例子:
HTML HEAD TITLE文件上传表格/TITLE /HEAD BODY TABLE FORM
ENCTYPE=”multipart/form-data” NAME=MyForm ACTION=submit.php3
METHOD=”POST” TRTD选择上传文件/TDTDINPUT NAME=”MyFile” TYPE=”File”/TD/TR
TRTD COLSPAN=”2″INPUT NAME=”submit” VALUE=”上传” TYPE=”submit”/TD/TR
/TABLE /BODY /HTML
注意表格中的ENCTYPE=”multipart/form-data”部分。这个一定不能错,否则服务器将不知道你在上传文件。
设计上传程序现在我们已经完成了前台部分,让我们再仔细地考虑后台是如何接收文件并保存它到我们指定的目录下去。下面就开始用PHP了。这是submit.php3的程序:
? If($MyFile != “none”) { copy($MyFile,”/home/berber/$MyFile_name”);
unlink($MyFile); } else { echo”你没有上传任何文?; } ?
不管你信不信,这就是整个处理过程。我们在程序中所做的就是: 1.
检查是否一个文件已经上传到服务器,通过If($MyFile != “none”);2.
拷贝文件到指定位置。3.
删除临时文件。当你按下了提交按钮后,文件将会从你的计算机上传到服务器的临时目录下。在临时目录下的文件名为一个临时文件。应该使用file字段的name值来访问它,在这里为$MyFile。真正的文件名使用file字段的name值加上”_name”来访问它,在这里为$MyFile_name。使用copy()函数,将临时文件$MyFile拷贝到指定目录下,拷贝后的文件名为$MyFile_name。完成后不要忘了删除临时文件,不然你会有许多你不想要的文件。
设置文件名一个可能让程序员睡不着觉的事情就是试图改变file字段的VALUE属性的值。并不是很多人知道它是不可能的。尽管W3C说可以,但实际上,象IE和Netscape都不允许设置VAUE属性的值。听上去有点可笑,为什么我不能设置一个初始值,这样让用户使用起来更方便呢?如果你那样做,那你就会发现你带来了一个安全上的漏洞。可以设想一下,你登录到我的网站,我可以改变一个表格中的file字段的值。那么有许能阻止我把你的/etc/passwd文件上传呢?更进一步的,我不需要你按下提交按钮,我可先设置file字段的值,然后通过一段JavaScript程序来模拟提交动作…哇呜…我可以处理你机器上的任何文件了。因为这个原因,浏览器简单地把INPUT标记中的file字段的VALUE字段给忽略了。
限制文件大小另一个酷的特性是限制上传文件的大小选项。只要增加一个INPUT标记就可以了:INPUT
TYPE=”hidden” name=”MAX_FILE_SIZE” value=”100000″
这个将不允许用户上传超过100KB的文件。显示文件大小为了显示文件大小,可以通过file字段name属性值加上”_size”这个变量来访问。在我们的例子中就是使用$MyFile_size。所以,如果你想告诉用户上传文件的大小,你可以象下面那样去做:
echo “You have just uploaded $MyFile_name”; echo “The size of the file
is $MyFile_size”;
权限很明显你需要对目标目录的写的权限。如果一个用户用匿文上传文件,那他的用户名应该是”bobody”。这个用户必须有对目标目录写的权限否则你可能得到一个象下面的信息:
Warning: Unable to create ‘/home/berber/berber.txt’: Permission denied
in /home/berber/submit.php3 on line 5

综述:表单作为用户提交信息的一个要害途径,一直是PHP编程中的一个最基本的方面,也是入门者会碰到的一个大的重点与难点。我们选择有关处理关联数、获得同名checkbox的选取值、上传文件方面比较轻易令众困惑的地方进行归

文件上传的实现
对ASP比较熟悉的朋友可能知道用ASP上传文件可是不太简单,PHP不同,比较容易,看例子:send.htm和get.php
如下: !–文件send.htm — form ENCTYPE=multipart/form-data
ACTION=get.php METHOD=post INPUT TYPE=hidden name=MAX_FILE_SIZE
value=1000 Send this file: INPUT NAME=userfile TYPE=file INPUT
TYPE=submit VALUE=Send File /form 下面的代码接收上传的文件 ?php
#文件get.php if (rename($userfile,/dir/upload.dat)) { echo 成功!; }
else {echo 上传不成功!; } ? 说明:
一、php.ini文件中upload_tmp_dir用来说明PHP上传的文件放置的临时目录
二、存放在临时目录的上传文件如果没有被移动或改名,那么马上会被删除
三、上传文件的目录要有写权限
最后的建议:不要让用户上传可以执行的文件,要不就设置不可以执行,大家应该知道为什么

  如何使用表单传递关联数组?

  通过表单传递的关联数组能被 each()函数读取,程序如下:

//test1.php
<form action=”test2.php” method=post>
<input type=hidden name=”var[Address]” value=”Beijing”>
<input type=hidden name=”var[‘age’]” value=”20″>
<input type=submit value=submit>
这个名为var[Address]值为”Beijing”的元素递交到test2.php后,就成了一个关联数组,var[“Address”]=”Beijing”:
//test2.php
<?
echo $var[“Address”];
?>

  输出结果为:Beijing

  如何处理同名checkbox?

  具体代码:

test1.php:
<FORM METHOD=POST ACTION=”test2.php”>
苹果<INPUT TYPE=”checkbox” NAME=”come[]”
VALUE=”苹果”><BR>
鸭梨<INPUT TYPE=”checkbox” NAME=”come[]”
VALUE=”鸭梨”><BR>
香蕉<INPUT TYPE=”checkbox” NAME=”come[]”
VALUE=”香蕉”><BR>
西瓜<INPUT TYPE=”checkbox” NAME=”come[]”
VALUE=”西瓜”><BR>
<INPUT TYPE=”submit” VALUE=”提交”>
</FORM>

test2.php:
你的选择:<BR>
<?
for ($i=0;$i<sizeof($come);$i ) echo $come[$i],”<BR>”;
?>
  这样从test1.php提交过来的所有名为come[]的元素就组成了一个数组,这样我们就可以很轻易地处理了.

  怎样才能察看提交的所有信息?

  一般来说,PHP引擎将每一个表单域放到一个叫做$HTTP_POST_VARS的数组中,所以我们可以通过读取这个数组就可以察看提交的所有信息:

<?
  echo “POST 所送出的值为:<BR>”;
  while ( list( $key, $val ) = each( $HTTP_POST_VARS ) ) {
    echo “$key => $val<BR>”;
  }
?>

  如何同时上传多个文件?

  我们来看一个例子。

  下面是上传文件的提交页面,利用该页面你不仅可以生成 1000
个上传文件框(也可以是任意多个 0~n ),而且可分别指出它们的保存路径。

  提交页面的文件输入框为命名为: file0,file1,…file100,…fileN
  提交页面的文件路径框为命名为: path0,path1,…path100,…pathN
  由于页面的生成非常简单,所以就不在此多解释了,用 javascript
定义了两个函数,check() 用于提交页面,create()用于生成文件上传框。
    phpfileup.htm
    ——————————————————–
    【文件php9.txt】
    ——————————————————–
  文件提交页面既已生成,下面任务就很明确了:将提交的文件内容保存到服务器上。

  我们先定义一个文件保存函数 fup() 它有两个参数:
    $filename: 文件内容
    $fname: 文件名(包含路径)
  剩下的就是写一个循环将文件依次写入服务器。

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图