功能分析
1、实现文件上传功能,为上传后的文件自动生成文件名
2、判断上传是否成功,可以在一个表单中上传多个文件
3、实现文件下载功能,将PHP的输出结果作为下载的文件内容
功能实现
1、创建文件上传表单
<form method="post" enctype="multipart/form-data">
//隐藏域MAX_FILE_SIZE用于指定允许上传的最大字节数
<input type="hidden" name="MAX_FILE_SIZE" value="1048576" />
<input type="file" name="upload" />
<input type="submit" value="上传文件" />
</form>
表单的提交方式是post,并设置enctype属性值为"multipart/form-data"
这是专门为表单提交数据设计的之中高效的编码格式
隐藏域MAX_FILE_SIZE用于指定允许上传的最大字节数,并且必须放在文件输入框的前面
2、PHP处理上传文件
PHP会将用户的上传文件的信息保存到$_FILES超全局变量中,通过var_dump()可以打印输出该数组
$_FILES的一维数组键名是文件上传输入框name属性名,二维数组中保存了该上传文件的具体信息
$_FILES[‘upload’][‘name’] :上传文件的名称
$_FILES[‘upload’][‘type’] :上传文件的MIME类型
$_FILES[‘upload’][‘tmp_name’]:保存在服务器中的临时文件路径
$_FILES[‘upload’][‘error’]:文件上传的错误代码,0表示成功
$_FILES[‘upload’][‘size’]:上传文件的大小,单位是字节
文件上传成功之后会暂时保存在服务器的临时目录中,为了让文件保存在指定目录中,需要使用move_uploaded_file() 函数将上传文件从目录中移动到新的位置。
移动文件时要先判断给定文件是否是通过HTTP POST上传的合法文件,防止将服务器中的其他文件当成用户上传,可通过is_uploaded_file() 判断
文件移动时如果遇到了同名文件,会自动进行替换
date_default_timezone_set("Asia/Shanghai");
if(isset($_FILES['upload'])){
if($_FILES['upload']['error']!==UPLOAD_ERR_OK){
exit('上传失败!');
}
$save='D:/warmpserver/wamp/www/MyCode/jsTest/upload/'.date('Y_m_d_G_i_s').'.datas';
if(!move_uploaded_file($_FILES['upload']['tmp_name'], $save)){
exit('上传失败,无法将文件保存到指定位置。');
}
$a_href=<<<eof
上传成功,文件保存路径:<a href="$save">$save</a>
eof;
echo $a_href;
}
注:时间默认时伦敦时间,所用使用data函数时要设置时区
不保存原文件名是为了防止客户端提交非法的文件名造成程序出错,也能防止客户端提交php文件,造成恶意脚本执行
3、文件下载
实现文件下载,主要是在http响应头中进行设置,告知浏览器不要直接解析该文件而是将文件以下载的方式打开
$file = "D:/123.rar";
//保存待下载文件的实际保存路径
$size = filesize($file);
//获取文件大小
//设置HTTP响应消息为文件下载
header('Content-type: application/zip');
header('Content-length:' . $size);
header('Content-Disposition: attachment; filename=' . basename($file));
//输出到浏览器,小文件
readfile($file);
/*/
/读取文件并输出,大文件
$limit = 1024;
//指定每次读取的字节数
$count = 0;
//记录已经读取的字节数
$handle = fopen($file, 'r');
while (!feof($handle) && ($size - $count > 0)) {
echo fread($handle, $imit);
$count += $size;
}
fclose($handle);*/
注:我测试时可以下载文件,但是每次下载的文件都被破坏,无法正常打开,如果有那位大佬知道问题在哪,希望可以指出,谢谢