网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using Dpz.Core.Infrastructure;
using Microsoft.Extensions.Logging;

namespace Dpz.Core.Service.ObjectStorage;

public class UpyunUpload(HttpClient httpClient,ILogger<UpyunUpload> logger)
{ 
    internal async Task<UploadResult> UploadAsync<TOperator>(
        ICollection<string> pathToFile,
        Func<HttpContent> setContent,
        TOperator operatorConfiguration,
        string? contentMd5 = null)
        where TOperator : UpyunOperator
    {
        if (pathToFile.Count == 0)
        {
            throw new ArgumentException("argument pathToFile does not any contain item.", nameof(pathToFile));
        }

        if (string.IsNullOrEmpty(operatorConfiguration.Bucket))
        {
            throw new ArgumentException("argument operatorConfiguration does not have bucket.", nameof(operatorConfiguration));
        }

        var uploadAddress = string.Join("/", pathToFile.Select(Uri.EscapeDataString));

        var request = new HttpRequestMessage(HttpMethod.Put, $"/{operatorConfiguration.Bucket}/{uploadAddress}")
        {
            Version = new Version(2, 0)
        };
        await request.SignatureAsync(operatorConfiguration, contentMd5);
        request.Content = setContent();
        var response = await httpClient.SendAsync(request);
        if (!response.IsSuccessStatusCode)
        {
            logger.LogError("upload fail,status code:{StatusCode}", response.StatusCode);
            throw new BusinessException($"upload fail,response status code:{response.StatusCode}");
        }

        #region upload result

        var uploadResult = new UploadResult
        {
            AccessUrl = GetAccessUrl(uploadAddress,operatorConfiguration),
            FileType = response.Headers.GetResponseHeaderValue("x-upyun-file-type", ""),
        };

        var frames = response.Headers.GetResponseHeaderValue("x-upyun-frames", "0");
        if (int.TryParse(frames, out var framesInt))
        {
            uploadResult.Frames = framesInt;
        }

        var width = response.Headers.GetResponseHeaderValue("x-upyun-width", "0");
        if (int.TryParse(width, out var widthInt))
        {
            uploadResult.Width = widthInt;
        }

        var height = response.Headers.GetResponseHeaderValue("x-upyun-height", "0");
        if (int.TryParse(height, out var heightInt))
        {
            uploadResult.Height = heightInt;
        }

        if (response.Content.Headers.ContentMD5 != null)
        {
            var md5Value = BitConverter.ToString(response.Content.Headers.ContentMD5).Replace("-", "")
                .ToLowerInvariant();
            logger.LogInformation("upload file:{AccessUrl},MD5 value:{MD5Value}", uploadResult.AccessUrl, md5Value);
            uploadResult.Md5 = md5Value;
        }

        #endregion

        return uploadResult;
    }
    
    private static string GetAccessUrl<TOperator>(string pathToFile, TOperator upyunOperator)
        where TOperator : UpyunOperator
    {
        return (upyunOperator.Host?.LastOrDefault() == '/' ? upyunOperator.Host : upyunOperator.Host + "/") +
               pathToFile;
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码定义了一个名为 UpyunUpload 的类,主要用于将文件上传到 Upyun 对象存储服务。以下是代码的主要功能和结构的详细解释:

类和构造函数

  • 类名: UpyunUpload
  • 构造函数: 接受两个参数:
    • HttpClient httpClient: 用于发送 HTTP 请求的客户端。
    • ILogger<UpyunUpload> logger: 用于记录日志的记录器。

方法

UploadAsync<TOperator>

这是一个异步方法,负责上传文件到 Upyun。它的参数包括:

  • ICollection<string> pathToFile: 要上传的文件路径集合。
  • Func<HttpContent> setContent: 一个函数,用于设置 HTTP 请求的内容。
  • TOperator operatorConfiguration: 包含上传所需配置的对象,必须是 UpyunOperator 的子类。
  • string? contentMd5: 可选的 MD5 校验值。
方法逻辑
  1. 参数验证:

    • 检查 pathToFile 是否为空,如果为空则抛出异常。
    • 检查 operatorConfiguration.Bucket 是否为空,如果为空则抛出异常。
  2. 构建上传地址:

    • 使用 string.JoinUri.EscapeDataString 将文件路径集合转换为 URL 编码的字符串。
  3. 创建 HTTP 请求:

    • 创建一个 HttpRequestMessage 对象,设置为 PUT 方法,并指定上传的 URL。
    • 调用 SignatureAsync 方法为请求签名(假设这是一个扩展方法,用于生成请求的签名)。
  4. 发送请求:

    • 使用 httpClient.SendAsync 发送请求,并等待响应。
    • 检查响应状态码,如果不是成功状态,则记录错误并抛出异常。
  5. 处理上传结果:

    • 创建 UploadResult 对象,存储上传结果信息。
    • 从响应头中提取文件类型、帧数、宽度和高度等信息,并将其存储在 UploadResult 中。
    • 如果响应内容包含 MD5 值,则记录该值并将其存储在 UploadResult 中。
  6. 返回结果:

    • 返回 UploadResult 对象,包含上传后的文件信息。

GetAccessUrl<TOperator>

这是一个私有静态方法,用于生成文件的访问 URL。它的参数包括:

  • string pathToFile: 文件的路径。
  • TOperator upyunOperator: 包含主机信息的对象。
方法逻辑
  • 该方法构建并返回一个完整的访问 URL,确保主机地址以斜杠结尾,并将文件路径附加到主机后面。

总结

整体而言,UpyunUpload 类提供了一个用于将文件上传到 Upyun 对象存储的功能,处理了请求的构建、发送、响应的处理以及错误的记录。它还提供了一个方法来生成文件的访问 URL。

loading