268 lines
9.7 KiB
PHP
268 lines
9.7 KiB
PHP
|
<?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;
|
|||
|
}
|
|||
|
|
|||
|
}
|