C# 如何在没有多部分MIME类型的情况下在ASP.Net WebAPI中接收大文件(>;2GB)?
有没有办法实现一个.net Web api来接收一个lrage文件(>2gb),该文件使用无缓冲区的输入流,而不使用多部分/表单数据mime类型 我试图用下面的代码来做,但它并没有完全读取流。我正试图上传100MB的文件,但它只将10MB写入“c:\sampl.zip”并输出。下面的代码出了什么问题C# 如何在没有多部分MIME类型的情况下在ASP.Net WebAPI中接收大文件(>;2GB)?,c#,asp.net-web-api,webapi2,C#,Asp.net Web Api,Webapi2,有没有办法实现一个.net Web api来接收一个lrage文件(>2gb),该文件使用无缓冲区的输入流,而不使用多部分/表单数据mime类型 我试图用下面的代码来做,但它并没有完全读取流。我正试图上传100MB的文件,但它只将10MB写入“c:\sampl.zip”并输出。下面的代码出了什么问题 public async Task<HttpResponseMessage> FileReceive1r(string id) {
public async Task<HttpResponseMessage> FileReceive1r(string id)
{
var content = new StreamContent(HttpContext.Current.Request.GetBufferlessInputStream(true));
Stream stream = HttpContext.Current.Request.GetBufferlessInputStream(true);
StreamReader rdr = new StreamReader(stream);
while(!rdr.EndOfStream)
{
//FileStream fs = new FileStream(@"c:\sampl.zip", FileMode.OpenOrCreate);
StreamWriter wrtr = new StreamWriter(new FileStream(@"c:\sampl.zip", FileMode.OpenOrCreate));
wrtr.Write(rdr.ReadToEnd());
wrtr.Close();
}
rdr.Close();
return await Task.FromResult(new HttpResponseMessage(HttpStatusCode.Created));
}
公共异步任务文件receive1r(字符串id)
{
var content=newstreamcontent(HttpContext.Current.Request.GetBufferlessInputStream(true));
Stream Stream=HttpContext.Current.Request.GetBufferlessInputStream(true);
StreamReader rdr=新的StreamReader(流);
而(!rdr.EndOfStream)
{
//FileStream fs=newfilestream(@“c:\sampl.zip”,FileMode.OpenOrCreate);
StreamWriter wrtr=newstreamwriter(newfilestream(@“c:\sampl.zip”,FileMode.OpenOrCreate));
wrtr.Write(rdr.ReadToEnd());
wrtr.Close();
}
rdr.Close();
返回wait Task.FromResult(新的HttpResponseMessage(HttpStatusCode.Created));
}
您可以使用以下代码以区块形式下载文件
public HttpResponseMessage Get()
{
string filename = @"c:\sampl.zip";
var response = this.Request.CreateResponse();
response.Content = new PushStreamContent(async (Stream outputStream, HttpContent content, TransportContext context) =>
{
try
{
var buffer = new byte[65536];
using (var video = File.Open(filename, FileMode.Open, FileAccess.Read))
{
var length = (int)video.Length;
var bytesRead = 1;
while (length > 0 && bytesRead > 0)
{
bytesRead = video.Read(buffer, 0, Math.Min(length, buffer.Length));
await outputStream.WriteAsync(buffer, 0, bytesRead);
length -= bytesRead;
}
}
}
finally
{
outputStream.Close();
}
});
return response;
}
是的。只要你有足够的记忆力。只要使用一个流,只要内容开始通过var stream=HttpContext.Current.Request.GetBufferlessInputStream(true)流式传输,我就会得到一个流;但是如何连续读取它,直到流中接收到最后一个字节。如果我使用stream.CopyToAsync(),它只读取一些数据并丢弃流。有什么建议吗?