2.5上传文件资源(OSS)

在互联网应用中,用户上传文件是一项常见需求,涵盖设置头像、发布图文动态、上传相册至网盘、分享 Vlog 到视频社区等场景。以下展示了多种文件上传的实现方式。

在互联网应用中,用户上传文件是一项常见需求,涵盖设置头像、发布图文动态、上传相册至网盘、分享 Vlog 到视频社区等场景。以下展示了多种文件上传的实现方式。

1. 使用 Form 表单方式上传

通过 Form 表单方式上传文件的方式与第 19.2.3 章节中描述的 Form 表单提交方法一致。

cs
await httpRemoteService.PostAsync("https://localhost:7044/HttpRemote/AddFile", builder => builder    .SetMultipartContent(multipart => multipart        .AddFileAsStream(@"C:\Workspaces\httptest.jpg", "file")));

若需上传多个文件,只需在 multipart 中继续添加(需保持表单名一致,如 files):

cs
await httpRemoteService.PostAsync("https://localhost:7044/HttpRemote/AddFiles", builder => builder    .SetMultipartContent(multipart => multipart        .AddFileAsStream(@"C:\Workspaces\httptest.jpg", "files")        .AddFileFromRemote("https://furion.net/img/furionlogo.png", "files")));

此外,还支持使用构建器模式,以及获取上传文件的返回值。更多详情可参考第 19.2.1 节。

cs
// 使用构建器模式await httpRemoteService.SendAsync(HttpRequestBuilder.Post("https://localhost:7044/HttpRemote/AddFile")    .SetMultipartContent(multipart => multipart        .AddFileAsStream(@"C:\Workspaces\httptest.jpg", "file")));// 更多详细用法可参考第 19.2.1 节

2. 使用非 Form 表单方式上传(OSS

在与某些 OSS(对象存储服务)或云网盘进行对接时,通常会遇到不支持传统 Form 表单方式上传文件的情况。此时,需要直接以文件字节数组或 Stream 流的形式上传文件。以下是具体实现示例:

cs
var fileStream = File.OpenRead("文件路径");   // 或使用:var fileBytes = File.ReadAllBytes("文件路径");await httpRemoteService.PutAsync("https://localhost:7044/HttpRemote/AddFile", builder => builder    .SetContent(fileStream));   // 或使用 .SetContent(fileBytes);

在某些特殊场景下,可能需要显式移除 Content-Type 请求头(即将其设置为空)。此时,可通过调用 SetOmitContentType(true) 方法实现,示例如下:

cs
await httpRemoteService.PutAsync("https://localhost:7044/HttpRemote/AddFile", builder => builder    .SetContent(fileStream) // 或使用 .SetContent(fileBytes);    .SetOmitContentType(true);    // .AutoSetHostHeader());   // 某些服务器可能会强制验证 Host 请求头(可选)

3. 使用 UploadFile 扩展方法(表单方式)

在视频分享等应用中,用户上传文件时通常需要查看实时进度。为此,可使用 UploadFile 扩展方法,该方法支持实时进度获取,并允许对文件类型和大小进行限制。

以下示例展示了如何打印上传进度:

cs
await httpRemoteService.UploadFileAsync("https://localhost:7044/HttpRemote/AddFile", @"C:\Workspaces\httptest.jpg", "file"    , async progress =>    {        Console.WriteLine(await progress.ToSummaryStringAsync());  // 输出简要进度信息    });

控制台输出示例:

bash
Transferred 0.01MB of 0.01MB (100.00% complete, Speed: 0.86MB/s, Time: 0.01s, ETA: 0.00s), File: httptest.jpg, Path: C:\Workspaces\httptest.jpg.

若需在控制台中实时显示文件上传进度,推荐使用 UpdateConsoleProgressAsync() 方法。示例如下:

cs
await httpRemoteService.UploadFileAsync("https://localhost:7044/HttpRemote/AddFile", @"C:\Workspaces\httptest.jpg", "file"    , progress => progress.UpdateConsoleProgressAsync()); // 在控制台中更新文件传输进度条// ✅ 或使用 UploadFileWithConsoleProgressAsync 方法(带控制台进度打印)await httpRemoteService.UploadFileWithConsoleProgressAsync("https://localhost:7044/HttpRemote/AddFile", @"C:\Workspaces\httptest.jpg", "file");

执行后,控制台将显示如下进度信息:

bash
File: httptest.jpg, Path: C:\Workspaces\httptest.jpg.[##################################################] 61.35% (0.01MB/0.01MB) Speed: 0.86MB/s, Time: 0.01s, ETA: 0.00s.

若需限制文件类型和大小,可如下操作:

cs
await httpRemoteService.SendAsync(HttpRequestBuilder.UploadFile("https://localhost:7044/HttpRemote/AddFile", @"C:\Workspaces\httptest.jpg", "file"    , async progress =>    {        Console.WriteLine(await progress.ToSummaryStringAsync());  // 输出简要进度信息    })    .SetAllowedFileExtensions(".jpg;.png")  // 仅允许 jpg 和 png 类型    .SetMaxFileSizeInBytes(5 * 1024 * 1024));  // 限制文件大小为 5MB

若需在上传文件时附加额外的表单参数,可如下操作:

cs
await httpRemoteService.SendAsync(HttpRequestBuilder.UploadFile("https://localhost:7044/HttpRemote/AddFile", @"C:\Workspaces\httptest.jpg", "file"    , async progress =>    {        Console.WriteLine(await progress.ToSummaryStringAsync());  // 输出简要进度信息    })    .WithMultipart(multipart =>    {        multipart.AddText("Furion", "name");    });

通过上述方式,可以灵活满足各类文件上传需求。