sendFile发送文件
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发送视频流
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发送邮件
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电子表格处理
=> array('selector' => ,'style' => ))
*/
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图片修改
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压缩包
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工具函数