PHP中,文件上传

2018-09-07 13:16

阅读:411

  在PHP中,文件上传一般是通过move_uploaded_file()来实现的。
boolmove_uploaded_file(stringfilename,stringdestination)本函数检查并确保由filename指定的文件是合法的上传文件(即通过PHP的HTTPPOST上传机制所上传的)。如果文件合法,则将其移动为由destination指定的文件。

如果filename不是合法的上传文件,不会出现任何操作,move_uploaded_file()将返回FALSE。

如果filename是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file()将返回FALSE。此外还会发出一条警告。

下面我们通过一个实例来说明PHP是如何实现文件上传的。
test.php的原文件
复制代码 代码如下:<html>
<head>
<metahttp-equiv=Content-Typecontent=text/html;charset=gb2312>
<title>网站文件上传实例</title>
<!--
-->
</head>
<body>
<formenctype=multipart/form-dataaction=action.phpmethod=post>
<inputtype=hiddenname=MAX_FILE_SIZEvalue=2000000>
<inputtype=filename=upfilesize=20>
<inputtype=submitvalue=上传文件>
</form>
</body>
</html>
MAX_FILE_SIZE隐藏字段(单位为字节)必须放在文件输入字段之前,其值为接收文件的最大尺寸。这是对浏览器的一个建议,PHP也会检查此项。在浏览器端可以简单绕过此设置,因此不要指望用此特性来阻挡大文件。实际上,PHP设置中的上传文件最大值是不会失效的。但是最好还是在表单中加上此项目,因为它可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。

注:要确保文件上传表单的属性是enctype=multipart/form-data,否则文件将无法上传。

在处理上传页面中,上传文件的信息是通过数组$_FILES来获取的。我们假设文件上传字段的名称如上例所示,为upfile,则文件信息为:

$_FILES[upfile][name]

上传文件的原文件名。

$_FILES[upfile][type]

文件的MIME类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此MIME类型在PHP端并不检查,因此不要想当然认为有这个值。

$_FILES[upfile][size]

上传文件的大小,单位为字节。

$_FILES[upfile][tmp_name]

文件上传后在服务端储存的临时文件名。

$_FILES[upfile][error]

和该文件上传相关的错误代码。

PHP将随文件信息数组一起返回一个对应的错误代码。该代码可以在文件上传时生成的文件数组中的error字段中被找到。代码如下:

UPLOAD_ERR_OK

其值为0,文件上传成功。

UPLOAD_ERR_INI_SIZE

其值为1,上传的文件超过了中upload_max_filesize选项限制的值,默认值为2M。如果要想上传更大的,我们可以在php.ini里查找upload_max_filesize=2M修改后即可生效。

UPLOAD_ERR_FORM_SIZE

其值为2,上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值。

UPLOAD_ERR_PARTIAL

其值为3,文件上传不完全,只有部分被上传。

UPLOAD_ERR_NO_FILE

其值为4,文件上传失败。

UPLOAD_ERR_NO_TMP_DIR

其值为6,找不到临时文件夹。PHP4.3.10和PHP5.0.3引进。

UPLOAD_ERR_CANT_WRITE

其值为7,文件写入失败。PHP5.1.0引进。

注:以上值在PHP4.3.0之后变成了PHP常量。
action.php的原代码
<?
/**
欢迎光临我们来我站交流学习经验

*/

functiongetname($exname){
$dir=tmp/;
$i=1;
if(!is_dir($dir)){
mkdir($dir,0777);
}

while(true){
if(!is_file($dir.$i...$exname)){
$name=$i...$exname;
break;
}
$i++;
}

return$dir.$name;
}

$exname=strtolower(substr($_FILES[upfile][name],(strrpos($_FILES[upfile][name],.)+1)));
$uploadfile=getname($exname);

if(move_uploaded_file($_FILES[upfile][tmp_name],$uploadfile)){
echo<h2><fontcolor=#ff0000>文件上传成功!</font></h2><br><br>;
}else{
echo<h2><fontcolor=#ff0000>文件上传失败!</font></h2><br><br>;
}
echo下面是文件上传的一些信息:
<br><br>原文件名:.$_FILES[upfile][name].
<br><br>类型:.$_FILES[upfile][type].
<br><br>临时文件名:.$_FILES[upfile][tmp_name].
<br><br>文件大小:.$_FILES[upfile][size].
<br><br>错误代码:.$_FILES[upfile][error];
?>

一定要确保上传后文件所在的文件夹的权限至为777,这点在服务器上体现的特别明显,有时我们编写的上传代码没有任何的错误,然而在网上却无法实现上传功能,原因就在这里。

本文只是讲了如何通过PHP来实现文件上传的,没看过这部分的朋友可以参考一下。


评论


亲,登录后才可以留言!