268 lines
9.7 KiB
PHP
Executable File
268 lines
9.7 KiB
PHP
Executable File
<?php
|
||
/**
|
||
* lvzheAdmin
|
||
* @author xiekunyu <raingad@foxmail.com>
|
||
* @license http://www.apache.org/licenses/LICENSE-2.0
|
||
*/
|
||
namespace utils;
|
||
|
||
//------------------------
|
||
// 文件下载和图片下载
|
||
//-------------------------
|
||
|
||
class File
|
||
{
|
||
/**
|
||
* 文件下载
|
||
* @param $file_path
|
||
* @param string $file_name
|
||
* @param string $file_size
|
||
* @param string $ext
|
||
*/
|
||
public static function download($file_path, $file_name = '', $file_size = '', $ext = '')
|
||
{
|
||
if (!$file_name) {
|
||
$file_name = basename($file_path);
|
||
}
|
||
if (!$file_size && in_array(substr($file_path, 0, 1), [".", "/"])) {
|
||
try {
|
||
$file_size = filesize($file_path);
|
||
} catch (\Exception $e) {
|
||
return "文件不存在";
|
||
}
|
||
}
|
||
if (!$ext) {
|
||
$ext = pathinfo($file_path, PATHINFO_EXTENSION);
|
||
}
|
||
if ($ext && !strpos($file_name, ".")) {
|
||
$file_name = $file_name . "." . $ext;
|
||
}
|
||
$content_type = self::getMime($ext);
|
||
header("Cache-Control:");
|
||
header("Cache-Control: public");
|
||
// 处理中文文件名
|
||
$ua = $_SERVER["HTTP_USER_AGENT"];
|
||
$encoded_filename = rawurlencode($file_name);
|
||
|
||
// 文件类型
|
||
if (preg_match("/Safari/", $ua)) {
|
||
header('Content-Type: application/octet-stream;charset=utf-8');
|
||
} else {
|
||
header("Content-type: {$content_type}");
|
||
}
|
||
//IE
|
||
if (preg_match("/MSIE/", $ua) || preg_match("/Trident\/7.0/", $ua)) {
|
||
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
|
||
} else if (preg_match("/Firefox/", $ua)) {
|
||
header('Content-Disposition: attachment; filename*="utf8\'\'' . $file_name . '"');
|
||
} else if (preg_match("/Safari/", $ua)) {
|
||
header('Content-Disposition: attachment; filename*=UTF-8\'\'' . $encoded_filename);
|
||
} else {
|
||
header('Content-Disposition: attachment; filename="' . $file_name . '"');
|
||
}
|
||
// 文件大小
|
||
if ($file_size) {
|
||
header("Accept-Length: " . $file_size);
|
||
header("Content-Length: " . $file_size);
|
||
}
|
||
readfile($file_path);exit();
|
||
}
|
||
|
||
/**
|
||
* 功能:php多种方式完美实现下载远程图片保存到本地
|
||
* 参数:文件url,保存文件名称,使用的下载方式
|
||
* 当保存文件名称为空时则使用远程文件原来的名称
|
||
* @param string $url 请求图片的链接
|
||
* @param string $filename 保存的文件名
|
||
* @param int $type 保存图片的类型 0为curl,适用于静态图片,其他为缓冲缓存,适用于动态图片
|
||
* @return string $filename 返回保存的文件名
|
||
*/
|
||
public static function downloadImage($url, $filename, $type = 0)
|
||
{
|
||
if ($url == '') {
|
||
return false;
|
||
}
|
||
$ext = pathinfo($filename, PATHINFO_EXTENSION);
|
||
if (!in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'ico', 'tif', 'tiff'])) {
|
||
$ext = pathinfo($url, PATHINFO_EXTENSION);
|
||
if (!in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'ico', 'tif', 'tiff'])) {
|
||
$ext = 'jpg';
|
||
}
|
||
$filename = $filename . "." . $ext;
|
||
}
|
||
|
||
//下载文件流
|
||
if ($type) {
|
||
$ch = curl_init();
|
||
$timeout = 5;
|
||
curl_setopt($ch, CURLOPT_URL, $url);
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
|
||
$img = curl_exec($ch);
|
||
curl_close($ch);
|
||
} else {
|
||
ob_start();
|
||
readfile($url);
|
||
$img = ob_get_contents();
|
||
ob_end_clean();
|
||
}
|
||
|
||
//保存文件
|
||
// try {
|
||
$fp2 = fopen($filename, 'w');
|
||
fwrite($fp2, $img);
|
||
fclose($fp2);
|
||
return $filename;
|
||
/*} catch (\think\Exception $e) {
|
||
//TODO 异常处理
|
||
return false;
|
||
}*/
|
||
}
|
||
|
||
/**
|
||
* 获取文件Mime
|
||
* @param string $ext
|
||
* @return string
|
||
*/
|
||
public static function getMime($ext)
|
||
{
|
||
$mimes = [
|
||
'xml' => 'text/xml',
|
||
'json' => 'application/json',
|
||
'js' => 'text/javascript',
|
||
'php' => 'application/octet-stream',
|
||
'css' => 'text/css',
|
||
'html' => 'text/html',
|
||
'htm' => 'text/html',
|
||
'xhtml' => 'text/html',
|
||
'rss' => 'application/rss+xml',
|
||
'yaml' => 'application/x-yaml',
|
||
'atom' => 'application/atom+xml',
|
||
'pdf' => 'application/pdf',
|
||
'text' => 'text/plain',
|
||
'png' => 'image/png',
|
||
'jpg' => 'image/jpeg',
|
||
'gif' => 'image/gif',
|
||
'csv' => 'text/csv',
|
||
'tif' => 'image/tiff',
|
||
'ai' => 'application/postscript',
|
||
'asp' => 'text/asp',
|
||
'au' => 'audio/basic',
|
||
'avi' => 'video/avi',
|
||
'rmvb' => 'application/vnd.rn-realmedia-vbr',
|
||
'3gp' => 'application/octet-stream',
|
||
'flv' => 'application/octet-stream',
|
||
'mp3' => 'audio/mpeg',
|
||
'wav' => 'audio/wav',
|
||
'sql' => 'application/octet-stream',
|
||
'rar' => 'application/octet-stream',
|
||
'zip' => 'application/zip',
|
||
'7z' => 'application/octet-stream',
|
||
'bmp' => 'application/x-bmp',
|
||
'cdr' => 'application/x-cdr',
|
||
'class' => 'java/*',
|
||
'exe' => 'application/x-msdownload',
|
||
'fax' => 'image/fax',
|
||
'icb' => 'application/x-icb',
|
||
'ico' => 'image/x-icon',
|
||
'java' => 'java/*',
|
||
'jfif' => 'image/jpeg',
|
||
'jpeg' => 'image/jpeg',
|
||
'jsp' => 'text/html',
|
||
'mp4' => 'video/mpeg4',
|
||
'mpa' => 'video/x-mpg',
|
||
'mpeg' => 'video/mpg',
|
||
'mpg' => 'video/mpg',
|
||
'mpga' => 'audio/rn-mpeg',
|
||
'ras' => 'application/x-ras',
|
||
'tiff' => 'image/tiff',
|
||
'txt' => 'text/plain',
|
||
'wax' => 'audio/x-ms-wax',
|
||
'wm' => 'video/x-ms-wm',
|
||
'apk' => 'application/vnd.android.package-archive',
|
||
'doc' => 'application/msword',
|
||
'dot' => 'application/msword',
|
||
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||
'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
|
||
'docm' => 'application/vnd.ms-word.document.macroEnabled.12',
|
||
'dotm' => 'application/vnd.ms-word.template.macroEnabled.12',
|
||
'xls' => 'application/vnd.ms-excel',
|
||
'xlt' => 'application/vnd.ms-excel',
|
||
'xla' => 'application/vnd.ms-excel',
|
||
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||
'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
|
||
'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12',
|
||
'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12',
|
||
'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12',
|
||
'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
|
||
'ppt' => 'application/vnd.ms-powerpoint',
|
||
'pot' => 'application/vnd.ms-powerpoint',
|
||
'pps' => 'application/vnd.ms-powerpoint',
|
||
'ppa' => 'application/vnd.ms-powerpoint',
|
||
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
||
'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
|
||
'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
|
||
'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12',
|
||
'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',
|
||
'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12',
|
||
'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',
|
||
];
|
||
return isset($mimes[$ext]) ? $mimes[$ext] : 'application/octet-stream';
|
||
}
|
||
|
||
/**
|
||
* 下载文件到服务器
|
||
* addtime 2020年8月28日 18:38:43
|
||
*/
|
||
public static function getFile($url, $save_dir = '', $filename = '', $type = 0)
|
||
{
|
||
if (trim($url) == '') {
|
||
return false;
|
||
}
|
||
if (trim($save_dir) == '') {
|
||
$save_dir = './';
|
||
}
|
||
if (0 !== strrpos($save_dir, '/')) {
|
||
$save_dir .= '/';
|
||
}
|
||
//创建保存目录
|
||
if (!file_exists($save_dir) && !mkdir($save_dir, 0777, true)) {
|
||
return false;
|
||
}
|
||
//获取远程文件所采用的方法
|
||
if ($type) {
|
||
$ch = curl_init();
|
||
$timeout = 5;
|
||
curl_setopt($ch, CURLOPT_URL, $url);
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
|
||
$content = curl_exec($ch);
|
||
curl_close($ch);
|
||
} else {
|
||
ob_start();
|
||
readfile($url);
|
||
$content = ob_get_contents();
|
||
ob_end_clean();
|
||
}
|
||
$size = strlen($content);
|
||
//文件大小
|
||
$fp2 = @fopen($save_dir . $filename, 'a');
|
||
fwrite($fp2, $content);
|
||
fclose($fp2);
|
||
unset($content, $url);
|
||
$res['code'] = 200;
|
||
$res['file_name'] = $filename;
|
||
return $res;
|
||
}
|
||
/**
|
||
* 检测文件大小
|
||
*/
|
||
public static function getFileSize($url)
|
||
{
|
||
$res = get_headers($url, true);
|
||
$filesize = round($res['Content-Length'] / 1024 / 1024, 2); //四舍五入获取文件大小,单位M
|
||
return $filesize;
|
||
}
|
||
|
||
}
|