133 lines
4.0 KiB
PHP
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
|
|
];
|
|
}
|
|
} |