im/extend/utils/File.php

268 lines
9.7 KiB
PHP
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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