im/extend/utils/File.php

268 lines
9.7 KiB
PHP
Raw Normal View History

2023-09-26 18:09:46 +08:00
<?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;
}
}