sendFile发送文件
<?php$doc = filter_input(INPUT_GET, 'file');if ($doc) { // decode requested file path $docPath = base64_decode($doc); // check file path if ($docPath !== false && file_exists($docPath)) { $mimeType = Utils::get_mime_type($docPath); if (stripos($mimeType, 'audio/') !== false || stripos($mimeType, 'video/') !== false) { // streaming media $stream = new VideoStream($docPath); $stream->start(); } else { // output document $fName = basename(filter_input(INPUT_SERVER, 'PATH_INFO')); $fSize = filesize($docPath); if (strpos($fName, '.') === false && strrpos(basename($docPath), '.') !== false) { $ext = substr(basename($docPath), -strrpos(basename($docPath), '.')); $fName .= $ext; } header('Content-type: ' . $mimeType); header('Content-disposition: filename="' . $fName . '"'); header('Content-Length: ' . $fSize); flush(); $fHandle = fopen($docPath, 'r'); while (!feof($fHandle)) { // send the current file part to the browser print fread($fHandle, 8192); // flush the content to the browser flush(); } fclose($fHandle); } } else { header('HTTP/1.0 401 Unauthorized'); echo 'Unauthorized access'; // log $fh = @fopen('getDoc.log', 'a'); if ($fh !== false) { $msg = 'Try to access not existing file'; fwrite($fh, PHP_EOL . date('Y-m-d H:i:s') . ' *** ' . $msg . ' ' . $docPath); fclose($fh); } }}
videoStream发送视频流
<?phpclass VideoStream { private $path = ''; private $stream = null; private $buffer = 102400; private $start = -1; private $end = -1; private $size = 0; /** * @param string $filePath */ public function setPath($filePath) { $this->path = $filePath; } /** * Open stream */ private function open() { if (!($this->stream = fopen($this->path, 'rb'))) { die('Could not open stream for reading'); } } /** * Set proper header to serve the video content */ private function setHeader() { ob_get_clean(); $mimeType = \Utils::get_mime_type($this->path); header("Content-Type: " . $mimeType); header("Cache-Control: max-age=2592000, public"); header("Expires: " . gmdate('D, d M Y H:i:s', time() + 2592000) . ' GMT'); header("Last-Modified: " . gmdate('D, d M Y H:i:s', @filemtime($this->path)) . ' GMT'); $this->start = 0; $this->size = filesize($this->path); $this->end = $this->size - 1; header("Accept-Ranges: 0-" . $this->end); if (isset($_SERVER['HTTP_RANGE'])) { $c_end = $this->end; list(, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2); if (strpos($range, ',') !== false) { header('HTTP/1.1 416 Requested Range Not Satisfiable'); header("Content-Range: bytes $this->start-$this->end/$this->size"); exit; } if ($range == '-') { $c_start = $this->size - substr($range, 1); } else { $range = explode('-', $range); $c_start = $range[0]; $c_end = (isset($range[1]) && is_numeric($range[1])) ? $range[1] : $c_end; } $c_end = ($c_end > $this->end) ? $this->end : $c_end; if ($c_start > $c_end || $c_start > $this->size - 1 || $c_end >= $this->size) { header('HTTP/1.1 416 Requested Range Not Satisfiable'); header("Content-Range: bytes $this->start-$this->end/$this->size"); exit; } $this->start = $c_start; $this->end = $c_end; $length = $this->end - $this->start + 1; fseek($this->stream, $this->start); header('HTTP/1.1 206 Partial Content'); header("Content-Length: " . $length); header("Content-Range: bytes $this->start-$this->end/" . $this->size); } else { header("Content-Length: " . $this->size); } } /** * close currently opened stream */ private function end() { fclose($this->stream); exit; } /** * perform the streaming of calculated range */ private function stream() { $i = $this->start; set_time_limit(0); while (!feof($this->stream) && $i <= $this->end) { $bytesToRead = $this->buffer; if (($i + $bytesToRead) > $this->end) { $bytesToRead = $this->end - $i + 1; } $data = fread($this->stream, $bytesToRead); echo $data; flush(); $i += $bytesToRead; } } /** * Start streaming video content */ public function start() { $this->open(); $this->setHeader(); $this->stream(); $this->end(); }}
sendEmail发送邮件
<?php$transport = new \Zend\Mail\Transport\Sendmail();$attachment = array();// add properties$msg = new \Zend\Mail\Message();$msg->addFrom('fromEmail', 'fromName') ->addTo('toEmail') ->setSubject('subject') ->addCc('ccEmail') ->addBcc('bccEmail');if (count($attachment) > 0) { // new MIME message $mimeMessage = new \Zend\Mime\Message(); // add body $text = new \Zend\Mime\Part(nl2br('body')); $text->type = \Zend\Mime\Mime::TYPE_HTML; $text->charset = 'utf-8'; $mimeMessage->addPart($text); // add attachment foreach ($attachment as $fPath) { if (file_exists($fPath)) { $attachment = new \Zend\Mime\Part(fopen($fPath, 'r')); $attachment->type = \Zend\Mime\Mime::TYPE_OCTETSTREAM; $attachment->filename = basename($fPath); $attachment->disposition = \Zend\Mime\Mime::DISPOSITION_ATTACHMENT; $attachment->encoding = \Zend\Mime\Mime::ENCODING_BASE64; $mimeMessage->addPart($attachment); } } $msg->setBody($mimeMessage);} else { $msg->setBody('body');}$transport->send($msg);
phpexcel电子表格解决
<?phpclass Exporter { /** @var string */ public $filename; /** @var string */ public $creator; /** @var string */ public $title; /** @var string */ public $description; /** @var string */ public $subject; /** @var string */ public $keywords; /** @var boolean */ public $boldTitle; /** @var boolean */ public $autoSizeText; /** * @var array * array(<sheet_index> => array('selector' => <cell_selector>,'style' => <PHPExcel_style_array>)) */ public $cellStyles; public function __construct() { $this->filename = date('Y_m_d_H_i_s', time()) . '.xlsx'; $this->creator = ''; $this->title = ''; $this->description = ''; $this->subject = ''; $this->keywords = ''; $this->boldTitle = false; $this->autoSizeText = false; $this->cellStyles = array(); } /** * @param string */ public function setFilename($fullFilename) { $this->filename = $fullFilename; } /** * @param string */ public function setCreator($creator) { $this->creator = $creator; } /** * @param string */ public function setTitle($title) { $this->title = $title; } /** * @param string */ public function setDescription($description) { $this->description = $description; } /** * @param string */ public function setSubject($subject) { $this->subject = $subject; } /** * @param string */ public function setKeywords($keywords) { $this->keywords = $keywords; } /** * @param boolean */ public function setBoldTitle($boldTitle) { $this->boldTitle = $boldTitle; } /** * @param boolean */ public function setAutoSizeText($autoSizeText) { $this->autoSizeText = $autoSizeText; } /** * @param array */ public function setCellStyles($cellStyles) { $this->cellStyles = $cellStyles; } /** * * @param array $sheetItems * @return string filename */ public function export($sheetItems) { //Generate PHPExcel $excel = new \PHPExcel(); $excel->getProperties() ->setCreator($this->creator) ->setTitle($this->title) ->setDescription($this->description) ->setSubject($this->subject) ->setKeywords($this->keywords); $idxSheet = 0; $lastColumn = null; foreach ($sheetItems as $sheetName => $items) { if ($idxSheet > 0) { $excel->createSheet($idxSheet); } $currSheet = $excel->setActiveSheetIndex($idxSheet); $currSheet->setTitle(mb_substr($sheetName, 0, 31)); //Fill data $idxRow = 1; foreach ($items as $subDatas) { $idxCol = 0; foreach ($subDatas as $itemValue) { $coords = \PHPExcel_Cell::stringFromColumnIndex($idxCol) . $idxRow; $currSheet->setCellValueExplicit($coords, $itemValue, \PHPExcel_Cell_DataType::TYPE_STRING); $idxCol++; } $idxRow++; } //Style: title bold if ($this->boldTitle) { $lastColumn = $currSheet->getHighestColumn(); $currSheet->getStyle('A1:' . $lastColumn . '1')->applyFromArray(array('font' => array('bold' => true))); } //Style: wrap and autosize text if ($this->autoSizeText) { $lastColumn = ($lastColumn) ? : $currSheet->getHighestColumn(); $currSheet->getStyle('A2:' . $lastColumn . $idxRow)->getAlignment()->setWrapText(true); $iterator = $lastColumn; $iterator++; for ($column = 'A'; $column != $iterator; $column++) { $currSheet->getColumnDimension($column)->setAutoSize(true); } } //Style cells if (count($this->cellStyles) > 0 && isset($this->cellStyles[$idxSheet])) { foreach ($this->cellStyles[$idxSheet] as $row) { $currSheet->getStyle($row['selector'])->applyFromArray($row['style']); } } $currSheet->garbageCollect(); $idxSheet++; } //Save $excel->setActiveSheetIndex(0); $writer = \PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); $writer->save($this->filename); return $this->filename; }}
ffmpeg图片批改
<?php/** * exp: Convert video to mp4 * $ffmpeg = new FFMpeg(); * $ffmpeg->open('xxx'); * $ffmpeg->setVcodec('libx264'); * $ffmpeg->setVquality('28'); * $ffmpeg->setAcodec('aac'); * $ffmpeg->setAquality('128k'); * $ffmpeg->setDuration('30'); * $success = $ffmpeg->save('xxx.mp4'); *//** * exp: Convert audio to mp3 * $ffmpeg = new FFMpeg(); * $ffmpeg->setAcodec('libmp3lame'); * $ffmpeg->setAquality('6'); * $ffmpeg->setDuration('30'); * $success = $ffmpeg->save('xxx.mp3'); *//** * exp: Export screenshot * $ffmpeg = new FFMpeg(); * $ffmpeg->open('xxx.mp4'); * $ffmpeg->setPosition('10'); * $ffmpeg->exportScreenshot('test.png'); *//** * exp: avconv -i source_path -codec:v libx264 -crf 28 -codec:a aac -b:a 128k -strict experimental dest_path *//** * Class FFMpeg */class FFMpeg{ /** * @var bool * Overwrite output files without asking. */ private $overwrite = true; /** * @var string * file path of (input) */ private $path = ''; /** * @var string * video codec (output) */ private $vcodec = ''; /** * @var string * audio codec (output) */ private $acodec = ''; /** * @var string * duration (output) * * Stop writing the output after its duration reaches duration. * duration may be a number in seconds, or in hh:mm:ss[.xxx] form. */ private $duration = ''; /** * @var string * quality (output audio) * FOR libmp3lame: 0-9 (a lower value is a higher quality * 0-3 will normally produce transparent results, * 4 (default) should be close to perceptual transparency, * 6 produces an "acceptable" quality.) * FOR OTHERS: bitrate (in bits/s) 128k, 256k */ private $aquality = ''; /** * @var string * quality (output video) * FOR libx264: 0-51 (0: lossless, 23: default, 51: rubbish, * A value of 18-28 is considered "sane" with 18 being "visually lossless".) * FOR OTHERS: bitrate (in bits/s) 800k, 1000k */ private $vquality = ''; /** * @var string * position may be either in seconds or in hh:mm:ss[.xxx] form. (input video) */ private $position = '3'; /** * @var string * This will scale to your desired width * and the height will be automatically scaled to the appropriate value to preserve aspect. */ private $width = ''; /** * @param string $filePath */ public function __construct($filePath = '') { $this->path = $filePath; } /** * @param boolean $overwrite */ public function setOverwrite($overwrite) { $this->overwrite = $overwrite; } /** * @param string $aquality */ public function setAquality($aquality) { $this->aquality = $aquality; } /** * @param string $vquality */ public function setVquality($vquality) { $this->vquality = $vquality; } /** * @param string $duration */ public function setDuration($duration) { $this->duration = $duration; } /** * @param string $filePath */ public function open($filePath) { $this->path = $filePath; } /** * @param string $acodec */ public function setAcodec($acodec) { $this->acodec = $acodec; } /** * @param string $vcodec */ public function setVcodec($vcodec) { $this->vcodec = $vcodec; } /** * @param string $position */ public function setPosition($position) { $this->position = $position; } /** * @param string $width */ public function setWidth($width) { $this->width = $width; } /** * @param string $filename * @return bool * @throws \Exception */ public function save($filename) { if (!file_exists($this->path)) { return false; } //Do ffmpeg command $cmdLine = 'avconv -i ' . str_replace(' ', '\ ', $this->path); if ($this->overwrite) { $cmdLine .= ' -y'; } // video codec if ($this->vcodec !== '') { $cmdLine .= ' -codec:v ' . $this->vcodec; } // video quality if ($this->vcodec !== '' && $this->vquality !== '') { if (stripos($this->vcodec, 'libx264') !== false || stripos($this->vcodec, 'h264') !== false) { if ($this->vquality >= 0 && $this->vquality <= 51) { $cmdLine .= ' -crf ' . $this->vquality; //h264 use -crf } else { throw new \Exception('quality of video: invalid argument (0-51)'); } } else { if (stripos($this->vquality, 'k') !== false) { $cmdLine .= ' -b:v ' . $this->vquality; // others can user -b:v (bitrate) } else { throw new \Exception('quality of video: invalid argument (128k, 256k...)'); } } } // audio codec if ($this->acodec !== '') { $cmdLine .= ' -codec:a ' . $this->acodec; } // audio quality if ($this->acodec !== '' && $this->aquality !== '') { if (stripos($this->acodec, 'libmp3lame') !== false || stripos($this->acodec, 'mp3') !== false) { if ($this->aquality >= 0 && $this->aquality <= 9) { $cmdLine .= ' -q:a ' . $this->aquality; //mp3 use -qscale:a } else { throw new \Exception('quality of audio: invalid argument (0-9)'); } } else { if (stripos($this->aquality, 'k') !== false) { $cmdLine .= ' -b:a ' . $this->aquality; // others can user -b:a (bitrate) } else { throw new \Exception('quality of audio: invalid argument (128k, 256k...)'); } } } // ouput maximium duration if ($this->duration !== '') { $cmdLine .= ' -t ' . $this->duration; } // strict mode $cmdLine .= ' -strict experimental ' . str_replace(' ', '\ ', $filename); $exec = shell_exec($cmdLine); return ($exec === null); } /** * @param string $imagename * @return bool */ public function exportScreenshot($imagename) { if (!file_exists($this->path)) { return false; } //Do ffmpeg command $cmdLine = 'avconv -i ' . str_replace(' ', '\ ', $this->path); if ($this->overwrite) { $cmdLine .= ' -y'; } if ($this->position) { $cmdLine .= ' -ss ' . $this->position; } if ($this->width) { $cmdLine .= ' -filter:v scale=' . $this->width . ':-1 '; } $cmdLine .= ' -frames:v 1 ' . str_replace(' ', '\ ', $imagename); $exec = shell_exec($cmdLine); return ($exec === null); }}
zip压缩包
<?phpclass Zip{ /** @var string */ protected $_encoding; /** @var string */ public $filename; /** * Zip constructor. */ public function __construct() { $this->setEncoding('CP437//IGNORE//TRANSLIT'); $this->filename = time() . '.zip'; } /** * @param string $enc */ public function setEncoding($enc = null) { $this->_encoding = $enc; } /** * @param string $fullFilename */ public function setFilename($fullFilename) { $this->filename = $fullFilename; } /** * * @param array $paths string[] * @return boolean TRUE on success, FALSE on failure */ public function compress($paths) { if (!is_array($paths)) { return false; } // TODO: rename file $cleanPaths = array(); foreach ($paths as $path) { $bName = basename($path); if ($this->_encoding !== null) { $bName = iconv('UTF-8', $this->_encoding, $bName); } $cleanPaths[$path] = $bName; } if (shell_exec('which zip') !== null) { $success = $this->_compressShell($cleanPaths); } else { $success = $this->_compressZipArchive($cleanPaths); } return $success; } /** * @param array $cleanPaths Files to archive. * key: full file path, value: new file name * @return boolean TRUE on success or FALSE on failure. */ protected function _compressShell($cleanPaths) { // create temporary working folder $tmpDir = basename($this->filename, '_tmpDir') . '/'; if (is_dir($tmpDir)) { if (!$this->_deleteDir($tmpDir)) { return false; } } if (!mkdir($tmpDir, 0777, true)) { return false; } // copy files to temporary working folder foreach ($cleanPaths as $path => $cleanPath) { copy($path, $tmpDir . $cleanPath); } // zip, 1->compress faster, j->junk (don't record) directory names, q->quiet operation $cmd = 'zip -1jq ' . $this->filename . ' ' . $tmpDir . '*'; $output = array(); exec($cmd, $output, $return); // delete temporary working folder $this->_deleteDir($tmpDir); // return will return non-zero upon an error if (!$return) { return true; } else { return false; } } /** * @param array $cleanPaths Files to archive. * key: full file path, value: new file name * @return boolean TRUE on success or FALSE on failure. */ protected function _compressZipArchive($cleanPaths) { $zip = new \ZipArchive(); // open zip file $zip->open($this->filename, \ZipArchive::CREATE); // add files, // TODO: improve performance foreach ($cleanPaths as $path => $cleanPath) { $zip->addFile($path, $cleanPath); } // close zip return $zip->close(); } /** * @param $dirPath * @return boolean */ protected function _deleteDir($dirPath) { if (!is_dir($dirPath)) { return false; } if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') { $dirPath .= '/'; } foreach (glob($dirPath . '*', GLOB_MARK) as $file) { if (is_dir($file)) { $this->_deleteDir($file); } else { unlink($file); } } return rmdir($dirPath); } /** * @param string $destination * @param array $entries * @return boolean */ public function deCompress($destination, $entries = null) { $zip = new \ZipArchive(); $zip->open($this->filename, \ZipArchive::CREATE); $res = $zip->extractTo($destination, $entries = null); $zip->close(); return $res; }}
utils工具函数
<?php/** * Get memory usage * @return string */public staticfunction get_memory_usage() { $mem_usage = memory_get_peak_usage(true); if ($mem_usage < 1024) { return $mem_usage . " bytes"; } elseif($mem_usage < 1048576) { return round($mem_usage / 1024, 2) . " KB"; } else { return round($mem_usage / 1048576, 2) . " MB"; }}/** * Detemine is JSON and decode JSON * @param string $json * @param bool $return_data * @return mixed the formed array or true on success, or false on failure */public static function is_json($json, $return_data = false) { $data = json_decode($json, true); return (json_last_error() == JSON_ERROR_NONE) ? ($return_data ? $data : TRUE) : FALSE;}/** * Set ini memory limit * @param mixed $newV string '1024M' or int 1024 * @return string the old value on success, false on failure. */public static function ini_set_memory_limit($newV) { $newVInt = (int)str_ireplace('M', '', (string)$newV); $oldV = ini_get('memory_limit'); $oldVInt = (int)str_ireplace('M', '', (string)$oldV); if ($oldVInt < $newVInt) { return ini_set('memory_limit', $newVInt . 'M'); } return $oldV;}/** * Get mine type of file * @param string $filename * @return mixed the mine type on success, or false on failure */public static function get_mime_type($filename) { $realpath = realpath($filename); if($realpath) { if (function_exists('finfo_file') && function_exists('finfo_open') && defined('FILEINFO_MIME_TYPE')) { $finfo = finfo_open(FILEINFO_MIME_TYPE); $mimetype = finfo_file($finfo, $realpath); finfo_close($finfo); return $mimetype; } if (function_exists('mime_content_type')) { return mime_content_type($realpath); } } return false;}