Files
hztha.hkpgsow.cn/app/service/UploadService.php
gaofeng 0b165153c6 提交
2026-05-13 10:44:29 +08:00

133 lines
4.0 KiB
PHP

<?php
namespace app\service;
use think\Exception;
class UploadService
{
/**
* 处理表单文件上传并转发到目标服务器
*
* @param string $fileField 表单文件字段名
* @param string $targetUrl 目标服务器URL
* @param array $extraFields 额外传递的字段
* @param array $headers 额外的请求头
* @return array 包含上传结果的数组
*/
public function uploadAndForward(string $fileField, string $targetUrl, array $extraFields = [], array $headers = []): array
{
// 获取上传的文件
$file = request()->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
];
}
}