westdc-zf1/application/module/Files/Files.php

394 lines
9.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Files;
use Files\Thumbnail;
use Files\Listener\FileListener;
class Files{
public $tbl_att = "attachments";
public $db;
public $source = "";
protected $events = NULL; //事件
function __construct($db = NULL)
{
if(empty($db))
{
$this->db = \Zend_Registry::get('db');
}else{
$this->db = $db;
}
$this->config = \Zend_Registry::get('config');
$this->event = new \Zend_EventManager_EventManager();
$FileListener = new FileListener();
@$this->events()->attachAggregate($FileListener);
}
public function events(\Zend_EventManager_EventCollection $events = NULL)
{
if ($events !== NULL) {
$this->events = $events;
} elseif ($this->events === NULL) {
$this->events = new \Zend_EventManager_EventManager(__CLASS__);
}
return $this->events;
}
//上传申请表
public function uploadApplicationForm($file,$orderid)
{
try{
if (empty($file) !== false) {
return array("error"=>"请选择要上传的文件");
}
if (@is_uploaded_file($file['tmp_name']) === false) {
return array("error"=>"文件上传失败,请重新上传");
}
if($file['size'] > 20 * 1024 * 1024)
{
return array('error'=>"文件大小超出限制");
}
$ext = $this->getFileTextExt($file['name']);
$filename = $orderid.".".$ext;
$dir = "../data/application_form/";
if (!file_exists($dir)) {
mkdir($dir);
}
$dir.=date("Y")."/";
if (!file_exists($dir)) {
mkdir($dir);
}
$new_filepath = $dir.$filename;
if (move_uploaded_file($file['tmp_name'], $new_filepath) === false) {
return array("error"=>"上传失败,请重试");
}
return array("file"=>$new_filepath);
}catch(Exception $e)
{
return array("error"=>$e->getMessage());
}
}
/**
* upload
*
* 文件上传
*
* @param Array $files e.g. $_FILES['Filedata']
*
* return Array $msg e.g. if($msg['error'])
*/
public function upload($files,$dir = "",$append = false,$filename="",$makeThumb = false)
{
if (empty($files) !== false) {
return array("error"=>"请选择要上传的文件");
}
if (@is_uploaded_file($files['tmp_name']) === false) {
return array("error"=>"文件上传失败,请重新上传");
}
$file = $files;
$results = $this->events()->trigger('upload.checkExt', $this, compact('file'));
$cache_data = $results->bottom();
if($cache_data !== true)
{
return $cache_data;
}
$results = $this->events()->trigger('upload.checkSize', $this, compact('file','conf'));
$cache_data = $results->bottom();
if($cache_data !== true)
{
return $cache_data;
}
$msg = array();
$file_name = $files['name']; //原文件名
$file_size = $files['size']; //文件大小
$results = $this->makeUploadTarget($dir,$append);
if(isset($results['error']))
{
return $results;
}//文件夹问题
$new_file_basename = $this->gen_uuid();
$file_ext = $this->getFileTextExt($file_name);
$new_file_name = $new_file_basename . '.' . $file_ext;//新文件名
//移动文件
$file_path = $results['save_path'] . $new_file_name ;
if (move_uploaded_file($file['tmp_name'], $file_path) === false) {
return array("error"=>"上传失败,请重试");
}
$dbsave = $db_path = $results['dbsave'];
$dbsave .= $new_file_name;//数据库最终存储的文件
$file_url = $dbsave;//文件链接
$msg['file_url'] = $file_url;
$msg['file_size'] = $file_size;
$msg['db_path'] = $dbsave;
$msg['realname'] = $file_name;
$msg['file_ext'] = $file_ext;
$msg['file_mime'] = $this->getFileMime($file_path);
return $msg;
}//文件上传
//生成上传文件的地址
public function makeUploadTarget($dir = "",$append = false)
{
//文件保存目录路径
if(empty($dir))
{
$save_path = $this->config->upload;
}else{
if($append === true)
{
$save_path = $this->config->upload.$dir;
}else{
$save_path = $dir;
}
}
if (@is_dir($save_path) === false) {
return array("error"=>"上传目录不存在。请联系管理员");
}
if (@is_writable($save_path) === false) {
return array("error"=>"上传目录没有写权限。请联系管理员");
}
$dbsave = ""; //数据库中存放的路径
if($append === true)
{
$dbsave = $dir;
}
$y = date("Y");
$m = date("m");
$d = date("d");
$save_path .= $y . "/";
$dbsave .= $y.'/';
if (!file_exists($save_path)) {
mkdir($save_path);
}
$save_path .= $m . "/";
$dbsave .= $m.'/';
if (!file_exists($save_path)) {
mkdir($save_path);
}
$save_path .= $d . "/";
$dbsave .= $d.'/';
if (!file_exists($save_path)) {
mkdir($save_path);
}
return array("save_path"=>$save_path,"dbsave"=>$dbsave);
}//创建上传文件的地址
//获取文件扩展名
public function getFileTextExt($file_name)
{
$temp_arr = explode(".", $file_name);
$file_ext = array_pop($temp_arr);
$file_ext = trim($file_ext);
$file_ext = strtolower($file_ext);
return $file_ext;
}
//获取文件Mime通过finfo扩展
public function getFileMime($file_name)
{
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$filetype = finfo_file($finfo, $file_name) ; //文件mime类型
finfo_close($finfo);
return $filetype;
}
//文件名uuid
public function gen_uuid() {
return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
// 32 bits for "time_low"
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
// 16 bits for "time_mid"
mt_rand( 0, 0xffff ),
// 16 bits for "time_hi_and_version",
// four most significant bits holds version number 4
mt_rand( 0, 0x0fff ) | 0x4000,
// 16 bits, 8 bits for "clk_seq_hi_res",
// 8 bits for "clk_seq_low",
// two most significant bits holds zero and one for variant DCE1.1
mt_rand( 0, 0x3fff ) | 0x8000,
// 48 bits for "node"
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
);
}
/**
* getOne()
*
* 从数据库获取单个文件的信息
*
* @param int id
*
* return array
*/
public function getOne($id){
$db = $this->db;
//下载单个附件
$sql = $db->query("select a.* from ".$this->tbl_att." a where a.id=$id order by a.ts_created desc");
$att = $sql->fetch();
if(empty($att['id']))
{
return false;
}
return $att;
}
public function delete($id){
$att = $this->getOne($id);
if(file_exists($this->config->upload.$att['filename'])){
if(unlink($this->config->upload.$att['filename']))
{
$sql = "DELETE FROM ".$this->tbl_att." WHERE id=$id";
if($this->db->exec($sql))
{
return true;
}else{
return "文件删除成功,数据库记录删除失败";
}
}else{
return "删除失败";
}
}else{
$sql = "DELETE FROM ".$this->tbl_att." WHERE id=$id";
if($this->db->exec($sql))
{
return "文件不存在,数据库记录删除成功";
}else{
return "文件不存在,数据库记录删除失败";
}
}
}
public function getAll($fields = ""){
$wheresql = array();
if($fields!="")
{
$wheresql[] = " a.id IN ($fields) ";
}
if(count($wheresql)>0)
{
$wheresql = " WHERE ".join(",",$wheresql);
}else{
$wheresql = "";
}
$sql = "SELECT a.*,u.username,u.id as uid FROM ".$this->tbl_att." a
LEFT JOIN tbl_member u ON a.userid=u.id
$wheresql
ORDER BY a.id DESC";
$rs = $this->db->query($sql);
$rows = $rs->fetchAll();
return $rows;
}
/**
* downloadFile
*
* 文件下载
*
* @param String $fullPath e.g. Zend_Registry::get('upload').$fileurl
*
* return file
*/
static function downloadFile( $fullPath ){
//判断是否已经输出头部
if( headers_sent() )
{
return false;
}
else{
// Required for some browsers
@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
// File Exists?
if( file_exists($fullPath) ){
// Parse Info / Get Extension
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
// Determine Content Type
switch ($ext) {
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}
header('Content-Description: File Transfer');
header("Cache-Control: private",false);
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($fullPath)."\";" );
header("Content-Transfer-Encoding: binary\n");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: public");
header("Content-Length: ".$fsize);
ob_clean();
flush();
if(readfile($fullPath))
return true;
else
return false;
} else
{return false;}
}
} //文件下载
}