file($fileField); if (!$file) { return $this->createErrorResult('未上传文件或上传失败'); } try { $config = config('app.upload_conf'); $configs=[]; foreach ($config as $key=>$con){ $configs[] = $key.':'.$con; } // 验证文件 $validate = validate([ $fileField =>implode('|',$configs), ]); if (!$validate->check([$fileField => $file])) { return $this->createErrorResult($validate->getError()); } // 使用cURL转发到目标服务器 $result = $this->forwardToTargetServer($file, $targetUrl, $extraFields, $headers); return $result; } catch (\Exception $e) { return $this->createErrorResult('上传过程中发生异常: ' . $e->getMessage()); } } /** * 使用cURL将文件转发到目标服务器 * * @param \think\File $file 文件对象 * @param string $targetUrl 目标URL * @param array $extraFields 额外字段 * @param array $headers 请求头 * @return array 包含响应信息的数组 */ private function forwardToTargetServer(\think\File $file, string $targetUrl, array $extraFields = [], array $headers = []): array { $ch = curl_init(); try { // 设置基本选项 curl_setopt($ch, CURLOPT_URL, $targetUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_TIMEOUT, 300); // 5分钟超时 // 构建上传数据 $postData = [ 'file' => new \CURLFile( $file->getPathname(), $file->getOriginalMime(), $file->getOriginalName() ) ]; // 添加额外字段 $postData = array_merge($postData, $extraFields); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); // 设置请求头 $httpHeaders = []; foreach ($headers as $headerName => $headerValue) { $httpHeaders[] = "$headerName: $headerValue"; } if (!empty($httpHeaders)) { curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeaders); } // 执行请求 $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $curlInfo = curl_getinfo($ch); // 检查错误 if ($response === false) { throw new Exception('cURL错误: ' . curl_error($ch)); } return [ 'code' => 1, 'http_code' => $httpCode, 'response' => $response, ]; } catch (\Exception $e) { return [ 'code' => 0, 'error' => $e->getMessage() ]; } finally { curl_close($ch); } } /** * 创建错误结果数组 * * @param string $message 错误信息 * @return array 错误结果 */ private function createErrorResult(string $message): array { return [ 'code' => 0, 'error' => $message ]; } }