C# WebApi中 获取http路径文件多少kb到多少kb 并且转为数据流Blob格式
时间: 2024-10-15 10:15:25 浏览: 44
在C# Web API中,获取HTTP路径上的文件大小并转换为DataStream Blob格式通常涉及两个步骤:首先读取文件,然后将其转换为合适的blob。以下是一个简单的示例,假设我们有一个公共静态方法`GetFileStream`用于读取文件:
```csharp
using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System.IO.Compression;
public class FileSizeFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
// 获取请求头中的范围指示(如果存在)
RangeItemHeaderValue range = context.HttpContext.Request.Headers["Range"];
if (range != null && range.From.HasValue && range.To.HasValue)
{
int startByte = range.From.Value.Value;
int endByte = Math.Min(range.To.Value.Value, GetFileSize(context.HttpContext.Request.PathAndQuery));
// 检查范围是否合理,否则返回416错误
if (startByte >= endByte)
{
context.Result = Request.CreateResponse(HttpStatusCode.RangeNotSatisfiable);
return;
}
using (FileStream fileStream = GetFileStream(context.HttpContext.Request.PathAndQuery))
{
long fileSize = fileStream.Length;
// 创建压缩后的DataStream
byte[] bytes = new byte[fileSize];
var compressedStream = new DeflateStream(new MemoryStream(bytes), CompressionMode.Compress);
// 如果有范围限制,只读取指定的部分
int bytesRead;
if (startByte > 0)
{
fileStream.Seek(startByte, SeekOrigin.Begin);
}
bytesRead = fileStream.Read(bytes, 0, (int)(endByte - startByte + 1));
compressedStream.Write(bytes, 0, bytesRead);
context.Result = new FileStreamResult(compressedStream, "application/octet-stream")
{
Range = $"bytes={startByte}-{endByte}"
};
}
}
else
{
// 文件下载全部内容
using (FileStream fileStream = GetFileStream(context.HttpContext.Request.PathAndQuery))
{
context.Result = new FileStreamResult(fileStream, "application/octet-stream");
}
}
}
private static long GetFileSize(string filePath)
{
FileInfo fileInfo = new FileInfo(filePath);
return fileInfo.Length;
}
private static FileStream GetFileStream(string filePath)
{
// 这里假设GetFileStream是一个能从给定路径加载文件的私有方法,实际使用时可能需要处理各种异常
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
return fileStream;
}
}
```
这个过滤器会在每个API动作执行前检查请求范围,如果存在,则根据指定范围读取并压缩文件;如果没有范围,就下载整个文件。
注意,这只是一个基础示例,实际应用中可能需要处理更多的边界情况,例如文件不存在、权限问题等。另外,对于大文件,直接读取到内存可能会导致性能问题,所以可能要考虑使用分块读取或流式传输技术。
阅读全文