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;}