PHP上传文件详解
首先在php.ini里配置上载文件。有以下几个重要的配置单:
选项 |
默认值 |
说明 |
post_max_size |
8M |
控制以后的POST请求的最大规模。必须大于upload_max_filesize选项值。 |
max_input_time |
60 |
指定一个POST请求提交所有数据可以花费的时间。以秒为单位。在此时间之后结束数据提交。 |
file_uploads |
On |
指出是否允许文件上传。默认值为on |
upload_max_filesize |
2M |
控制PHP接受的最大文件规模。如果文件太大,PHP就写入一个0字节的占位符文件。 |
upload_tmp_dir |
NULL |
必须设置为一个有效目录。可以将上传的文件放在这里等候处理。 |
然后,在表单HTML中设置文件上传。需要注意三个地方:
- 1. 将form表单提交方式设为POST
- 2. 添加一个“file”类型的新的标记<input>。
- 3. 将enctype属性添加到表单中,表示将使用新的multipart/form-data MIME类型。
这里,如果表单提交方式为GET,则提交的FILE数据无效。如果input标记的类型不为file,则提交的文件地址,并且将enctype设为multipart/form-data,则提交的文件地址将成为POST数据的一部分。
提交数据以后,服务器通过超级全局数组$_FILES访问提交的文件。这个数组包含的元素个数为表单file个数相同。例如:如果表单里有一个上传文件的选框:
<input type=”file” name=”filename”>
当提交数据后,可以通过$_FILES[‘filename’]来取得这个文件的信息。该信息如下:
$_FILES[‘filename’]:
[‘name’] => 文件名
[‘type’] => 文件MIME类型。如image/jpeg, text/plain, application/octet-stream等。
[‘tmp_name’] => 如果文件小于允许上传文件大小,则该位置表示上传的文件临时存放路径及临时文件名,被放在upload_tmp_dir所指定的位置。
[‘error’] => 错误代码。
[‘size’] => 文件大小。
其中error错误代码可能的值如下表:
编码 |
值 |
说明 |
UPLOAD_ERR_OK |
0 |
文件成功上传 |
UPLOAD_ERR_INI_SIZE |
1 |
文件大小比php.ini中upload_max_filesize指定值要大 |
UPLOAD_ERR_FORM_SIZE |
2 |
文件的小比表单的MAX_FILE_SIZE指定的值大 |
UPLOAD_ERR_PARTIAL |
3 |
文件上传不完整(可能因为请求时间过长被终止) |
UPLOAD_ERR_NO_FILE |
4 |
没有文件随着这个请求上传 |
UPLOAD_ERR_NO_TMP_DIR |
6 |
在php.ini中没有指定临时文件夹 |
只有当$_FILES[‘filename’][‘error’]的值为0时,才应该继续处理文件。
尽管可以使用copy或rename等文件处理函数来完成将文件从临时位置转移到最终保存位置的操作,但出于安全性考虑,应该使用move_upload_file函数来完成这一操作。
对上传文件进行验证:
文件大小验证:若文件的$_FILES[‘filename’][‘error’]=0,即上传的文件大小要小于指定的upload_max_filesize,则可进行下一步子验证:通过$_FILES[‘filename’][‘size’]与指定大小值比较。
文件类型验证:可用类似于以下的代码进行文件类型验证:
function _validateMiniature(){
$fileType = ‘nonsupport‘;
if(!empty($_FILES) && $_FILES[‘miniature‘][‘error‘] == 0){
$ext = strtolower(pathinfo($_FILES[‘miniature‘][‘name‘],PATHINFO_EXTENSION));
//the extension of the upload file
switch($ext){
case ‘jpg‘: case ‘jpeg‘:
$fileType = ‘image/jpeg‘;
break;
case ‘gif‘:
$fileType = ‘image/gif‘;
break;
default:
$fileType = ‘nonsupport‘;
}
return $fileType;
}
}
其它验证可根据具体要求进行相应的验证处理。
最后,若上传的文件通过了验证,则可以使用类似于以下的代码进行文件保存:if(move_uploaded_file($_FILES[‘miniature‘][‘tmp_name‘],getenv(‘DOCUMENT_ROOT‘).$filepath)){//…..文件正常上传操作….}
转自:http://blog.csdn.net/donnki/article/details/1771850
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。