上面说到过文件上传的过程,现在详细说一下文件的下载过程,在下载过程中,曾遇到过下载的文件与原上传文件,大小不一,乱码的情况,现在将详细叙述问题解决的全过程。
先简单说下编码格式,
header("Content-type: text/html; charset=utf-8");
header("Content-type: text/html; charset=gb2312");
这句话的意思是定义PHP页面的编码格式为utf-8或者GB2312,提示浏览器用什么字符集展现,GB还是utf-8,这样才不会造成编码错误而产生乱码。
下载代码实现:文件名为:download.php
$file_count))
{ //feof检测是否已经到达文件末尾
//如果文件还没读到结尾,且还有数据没有发送
$senddata=fread($file_type,$buffer);
//读取文件内容到缓存区
$file_count+=$senddata;
echo $senddata;
}
//echo fread($file_type,filesize($file_url));
fclose($file_type);
}
?>
$upload=new upload('myFile','test');//实例化
$dest=$upload->uploadFile();//文件上传,返回文件路径
upload.class.php代码如下:
$uploadPath='./uploads',
$imgFlag=true,
$maxSize=5242880,
$allowMime=array('HEX','application/octet-stream','image/jpg','XH'))
{
$this->fileName=$fileName;
$this->maxSize=$maxSize;
$this->allowMime=$allowMime;//支持的类型
$this->allowExt=$allowExt;//允许的扩展名
$this->uploadPath=$uploadPath;
$this->imgFlag=$imgFlag;//检测是否为真实图片
$this->fileInfo=$_FILES[$this->fileName];
}
/**
* 检测上传文件是否出错
* @return boolean
*/
protected function checkError(){
if(!is_null($this->fileInfo)){
if($this->fileInfo['error']>0){
switch($this->fileInfo['error']){
case 1:
$this->error='超过了PHP配置文件中
upload_max_filesize选项的值';
break;
case 2:
$this->error='超过了表单中MAX_FILE_SIZE设置的值';
break;
case 3:
$this->error='文件部分被上传';
break;
case 4:
$this->error='没有选择上传文件';
break;
case 6:
$this->error='没有找到临时目录';
break;
case 7:
$this->error='文件不可写';
break;
case 8:
$this->error='由于PHP的扩展程序中断文件上传';
break;
}
return false;
}else{
return true;
}
}else{
$this->error='文件上传出错';
return false;
}
}
/**
* 检测上传文件的大小
* @return boolean
*/
protected function checkSize(){
if($this->fileInfo['size']>$this->maxSize){
$this->error='上传文件过大';
return false;
}
return true;
}
/**
* 检测扩展名
* @return boolean
*/
protected function checkExt(){
$this->ext=pathinfo($this->fileInfo['name'],PATHINFO_EXTENSION);
/* if(!in_array($this->ext,$this->allowExt)){
$this->error= '不允许的扩展名!';
return false;
} */
return true;
}
/**
* 检测文件的类型
* @return boolean
*/
protected function checkMime(){
if(!in_array($this->fileInfo['type'],$this->allowMime)){
$this->error='不允许的文件类型!';
return false;
}
return true;
}
/**
* 检测是否是真实图片
* @return boolean
*/
protected function checkTrueImg(){
if($this->imgFlag){
if(!@getimagesize($this->fileInfo['tmp_name'])){
$this->error='不是真实图片!';
return false;
}
return true;
}
}
/**
* 检测是否通过HTTP POST方式上传上来的
* @return boolean
*/
protected function checkHTTPPost(){
if(!is_uploaded_file($this->fileInfo['tmp_name'])){
$this->error='文件不是通过HTTP POST方式上传上来的';
return false;
}
return true;
}
/**
*显示错误
*/
protected function showError(){
exit(''.$this->error.'');
}
/**
* 检测目录不存在则创建
*/
protected function checkUploadPath(){
if(!file_exists($this->uploadPath)){
mkdir($this->uploadPath,0777,true);
}
}
/**
* 产生唯一字符串
* @return string
*/
protected function getUniName(){
//return md5(uniqid(microtime(true),true));
//uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID
return uniqid(microtime(true),true);
}
/**
* 上传文件
* @return string
*/
public function uploadFile(){
if($this->checkError()&&$this->checkHTTPPost()&&$this->checkExt()){
$this->checkUploadPath();
$this->uniName=$this->getUniName();
$this->destination=$this->uploadPath.'/'.$this->uniName.'.'.$this->ext;
if(@move_uploaded_file($this->fileInfo['tmp_name'], $this->destination)){
return $this->destination;
}else{
$this->error='文件移动失败';
$this->showError();
}
}else{
$this->showError();
}
}
}