在.net4.5框架下使用c#下载大文件的webapi接口demo
时间: 2024-10-22 22:17:10 浏览: 3
在.NET 4.5框架下,使用C#创建一个Web API接口来下载大文件通常会涉及到分块传输和流式处理,避免一次性加载整个文件到内存中。以下是一个简单的示例:
```csharp
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
[Route("api/download")]
public class DownloadController : ControllerBase
{
[HttpGet]
public async Task<IActionResult> DownloadFile(long fileId)
{
// 模拟从数据库获取文件ID关联的实际文件URL
string downloadUrl = GetDownloadUrl(fileId);
if (string.IsNullOrEmpty(downloadUrl))
return NotFound();
// 创建HTTP客户端
WebClient client = new WebClient();
// 设置响应头以模拟浏览器请求,例如断点续传
client.Headers.Add(HttpRequestHeader.Range, $"bytes=0-{int.MaxValue}");
client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0");
try
{
using (var responseStream = await client.OpenReadAsync(downloadUrl))
{
// 获取文件长度
long fileSize = responseStream.Length;
// 定义输出流
var outputStream = Response.Body as Stream;
// 开始下载并写入流
byte[] buffer = new byte[8192];
int bytesRead;
int totalBytesRead = 0;
do
{
bytesRead = await responseStream.ReadAsync(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
outputStream.Write(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
// 更新进度百分比或其他UI反馈
UpdateProgress(totalBytesRead, fileSize);
}
} while (bytesRead != 0);
return StatusCode(HttpStatusCode.OK);
}
}
catch (Exception ex)
{
// 处理错误
return StatusCode((int)HttpStatusCode.BadRequest, new { message = ex.Message });
}
}
private void UpdateProgress(int bytesReceived, long fileSize)
{
// 这里你可以更新前端的进度条或者其他用户界面组件显示下载进度
// 例如:
// ViewData["progress"] = (double)bytesReceived / fileSize * 100;
}
private string GetDownloadUrl(long fileId)
{
// 这里只是一个模拟函数,实际应用中需要根据你的业务逻辑替换为真实的URL查询
// 如果不存在对应文件ID,返回null
// return "http://yourserver.com/files/" + fileId;
throw new NotImplementedException("Replace this with actual implementation.");
}
}
```
阅读全文