作者 lyh

gxdemo脚本

@@ -64,69 +64,63 @@ class FileManageController extends BaseController @@ -64,69 +64,63 @@ class FileManageController extends BaseController
64 */ 64 */
65 public function downLoad() 65 public function downLoad()
66 { 66 {
67 - if(!isset($this->param['path']) || empty($this->param['path'])){  
68 - $this->response('参数错误',Code::SYSTEM_ERROR); 67 + // 检查参数
  68 + if (!isset($this->param['path']) || empty($this->param['path'])) {
  69 + $this->response('参数错误', Code::SYSTEM_ERROR);
69 } 70 }
  71 + // 获取文件名和 URL
70 $username = basename($this->param['path']); 72 $username = basename($this->param['path']);
71 $parsed_url = parse_url($this->param['path']); 73 $parsed_url = parse_url($this->param['path']);
72 - if(isset($parsed_url['scheme'])){  
73 - $fileUrl = $this->param['path'];  
74 - // 获取文件头信息  
75 - $headers = get_headers($fileUrl, 1);  
76 - if ($headers === false || !isset($headers['Content-Length'])) {  
77 - $this->response('无法获取文件信息', Code::SYSTEM_ERROR);  
78 - }  
79 - $fileSize = $headers['Content-Length'] ?? 0;  
80 - $contentType = $headers['Content-Type'] ?? 'application/octet-stream';  
81 - // 设置响应头  
82 - header('Content-Description: File Transfer');  
83 - header('Content-Type: ' . $contentType);  
84 - header('Content-Disposition: attachment; filename="' . $username . '"');  
85 - if ($fileSize > 0) {  
86 - header('Content-Length: ' . $fileSize);  
87 - }  
88 - header('Cache-Control: must-revalidate');  
89 - header('Pragma: public');  
90 - // 初始化 cURL  
91 - $ch = curl_init();  
92 - curl_setopt($ch, CURLOPT_URL, $fileUrl);  
93 - curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);  
94 - curl_setopt($ch, CURLOPT_HEADER, false);  
95 - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  
96 - curl_setopt($ch, CURLOPT_BUFFERSIZE, 18192); // 设置缓冲区大小  
97 - curl_setopt($ch, CURLOPT_TIMEOUT, 300); // 设置超时时间  
98 - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);  
99 - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  
100 - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  
101 - // 分块输出文件内容  
102 - curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $data) {  
103 - echo $data;  
104 - flush(); // 强制输出  
105 - return strlen($data);  
106 - });  
107 - // 执行 cURL  
108 - ob_end_clean(); // 清空输出缓冲  
109 - curl_exec($ch);  
110 - // 检查 HTTP 状态码和 cURL 错误  
111 - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);  
112 - if (curl_errno($ch) || $httpCode != 200) {  
113 - $errorMsg = curl_errno($ch)  
114 - ? 'cURL 错误: ' . curl_error($ch)  
115 - : 'HTTP 错误: ' . $httpCode;  
116 - curl_close($ch);  
117 - $this->response('文件下载失败: ' . $errorMsg, Code::SYSTEM_ERROR);  
118 - } 74 + $fileUrl = isset($parsed_url['scheme'])
  75 + ? $this->param['path']
  76 + : 'https://file.globalso.com' . $this->param['path'];
  77 + // 获取文件头信息
  78 + $headers = get_headers($fileUrl, 1);
  79 + if ($headers === false || !isset($headers['Content-Length'])) {
  80 + $this->response('无法获取文件信息', Code::SYSTEM_ERROR);
  81 + }
  82 + $fileSize = $headers['Content-Length'] ?? 0;
  83 + $contentType = $headers['Content-Type'] ?? 'application/octet-stream';
  84 + // 设置响应头
  85 + header('Content-Description: File Transfer');
  86 + header('Content-Type: ' . $contentType);
  87 + header('Content-Disposition: attachment; filename="' . $username . '"');
  88 + if ($fileSize > 0) {
  89 + header('Content-Length: ' . $fileSize);
  90 + }
  91 + header('Cache-Control: must-revalidate');
  92 + header('Pragma: public');
  93 + // 初始化 cURL
  94 + $ch = curl_init();
  95 + curl_setopt($ch, CURLOPT_URL, $fileUrl);
  96 + curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
  97 + curl_setopt($ch, CURLOPT_HEADER, false);
  98 + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  99 + curl_setopt($ch, CURLOPT_BUFFERSIZE, 8192); // 设置缓冲区大小
  100 + curl_setopt($ch, CURLOPT_TIMEOUT, 300); // 设置超时时间
  101 + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
  102 + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  103 + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  104 + // 分块输出文件内容
  105 + curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $data) {
  106 + echo $data;
  107 + flush(); // 强制输出
  108 + return strlen($data);
  109 + });
  110 + // 执行 cURL
  111 + ob_end_clean(); // 清空输出缓冲
  112 + curl_exec($ch);
  113 + // 检查 HTTP 状态码和 cURL 错误
  114 + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  115 + if (curl_errno($ch) || $httpCode != 200) {
  116 + $errorMsg = curl_errno($ch)
  117 + ? 'cURL 错误: ' . curl_error($ch)
  118 + : 'HTTP 错误: ' . $httpCode;
119 curl_close($ch); 119 curl_close($ch);
120 - exit;  
121 - } else {  
122 - $fileUrl = 'https://file.globalso.com'.$this->param['path'];  
123 - // 设置响应头  
124 - header('Content-Description: File Transfer');  
125 - header('Content-Type: application/octet-stream');  
126 - header('Content-Disposition: attachment; filename="' . $username . '"');  
127 - // 下载文件  
128 - readfile($fileUrl); 120 + $this->response('文件下载失败: ' . $errorMsg, Code::SYSTEM_ERROR);
129 } 121 }
  122 + curl_close($ch);
  123 + exit;
130 } 124 }
131 125
132 126