我用的是easyUpload插件,前端根据说明写好之后后端写一个接收接口。
我用的是thinkphp5
public function upload(){
$file = Request::instance()->file('file');
//给定目录
// var_dump($file);die;
$info = $file->move('upload');
var_dump($info);die;
if($info && $info->getPathname()){
// echo $info->getPathname();die;
return show(200,'success','/'.$info->getPathname());
}
return show(0,'upload error');
}
function show($status, $message,$data=[]){
return [
'code'=> intval($status),
'message'=>$message,
'data'=>$data,
];
}
上面是后端程序config里面设置默认json格式输出。
拓展下可以在$info里面获取文件大小等信息。
上述内容正常接收图片啥的都没问题,但是一旦遇到大文件会失败的。
因为php默认是对于每个页面的内存,时间,上传文件等有限制的。需要修改php.ini文件已确保大文件上传。
upload_max_filesize = 8m ;允许上传文件大小的最大值。默认为2M
post_max_size = 8m ;表单POST给PHP能接收的最大值。默认为8M
max_execution_time = 30 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 60 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 8m ;每个PHP页面所吃掉的最大内存,默认8M
将上述内容改为实际项目需要数量,重启apache即可。
--------------------------下载-------------------------
下载其实比较简单,直接在<a href="链接地址">下载<a>即可,但这样不太安全,过于暴露。
将所有的下载转至统一页面进行安全验证后释放会比较好。
id是该文件的唯一标识,token算是保护措施,验证通过则提供下载。方法写的比较随意可以多多拓展,可以验证登录,ip,session啥的验证。
public function download($id,$token){
if(!is_numeric($id) && $token != $this->token){
die('error009');
}
$file_info = model('GameVersion')->getOneData('id = '.$id);//获取文件信息
$file_url = '.'.$file_info['down_link'];
$new_name = $file_info['resource_name'];
if(!isset($file_url)||trim($file_url)==''){
echo '500';
die('error011');
}
if(!file_exists($file_url)){ //检查文件是否存在
echo '404';
die('error010');
}
$file_name=basename($file_url);//获取文件名
$file_type=explode('.',$file_url);
$file_type=$file_type[count($file_type)-1];//获取类型
$file_name = $new_name.'.'.$file_type;//设置名称类型
$file=fopen($file_url,'r'); //打开文件
//输入文件标签
header("Content-type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Accept-Length: ".$file_info['file_size']);
header("Content-Disposition: attachment; filename=".$file_name);
//输出文件内容
echo fread($file,filesize($file_url));
fclose($file);
}
另外这里可能还会用到字节转kb或mb之类的需求,一并写在这里。
function kb($filesize){
if ($filesize >= 1073741824) {
$filesize = round($filesize / 1073741824 * 100) / 100 .' GB';
} elseif ($filesize >= 1048576) {
$filesize = round($filesize / 1048576 * 100) / 100 .' MB';
} elseif($filesize >= 1024) {
$filesize = round($filesize / 1024 * 100) / 100 . ' KB';
} else {
$filesize = $filesize.' Bytes';
}
return $filesize;
}
来源:oschina
链接:https://my.oschina.net/u/3538113/blog/1623357