Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 上载和接收使用ASP.NET进行http压缩的大型文件时,会给出;mime多部分流意外结束“;_C#_Asp.net_File Upload_Asp.net Web Api2_Large Files - Fatal编程技术网

C# 上载和接收使用ASP.NET进行http压缩的大型文件时,会给出;mime多部分流意外结束“;

C# 上载和接收使用ASP.NET进行http压缩的大型文件时,会给出;mime多部分流意外结束“;,c#,asp.net,file-upload,asp.net-web-api2,large-files,C#,Asp.net,File Upload,Asp.net Web Api2,Large Files,我很难在ASP.NET中使用HTTP文件上载发送大文件 目标是传输大于2GB的内容,压缩以节省带宽。发送3GB未压缩文件效果良好,所有文件都已正确接收并保存在磁盘上。然而,当我使用压缩(gzip或deflate)时,我从接收API中得到以下错误: Unexpected end of MIME multipart stream. MIME multipart message is not complete. 问题是,只有在发送大请求时(大约300MB是上限),我才会得到例外。上传200MB压缩文

我很难在ASP.NET中使用HTTP文件上载发送大文件

目标是传输大于2GB的内容,压缩以节省带宽。发送3GB未压缩文件效果良好,所有文件都已正确接收并保存在磁盘上。然而,当我使用压缩(gzip或deflate)时,我从接收API中得到以下错误:

Unexpected end of MIME multipart stream. MIME multipart message is not complete.
问题是,只有在发送大请求时(大约300MB是上限),我才会得到例外。上传200MB压缩文件效果良好

以下是上传代码:

using (var client = new HttpClient())
{
    using (var content = new MultipartFormDataContent())
    {
        client.BaseAddress = new Uri(fileServerUrl);
        client.DefaultRequestHeaders.TransferEncodingChunked = true;

        CompressedContent compressedContent = new CompressedContent(content, "gzip");

        var request = new HttpRequestMessage(HttpMethod.Post, "/api/fileupload/")
        {
            Content = compressedContent
        };

        var uploadResponse = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;
    }
}
该类是WebApiContrib帮助程序集中的一个类

这是接收端

// CustomStreamProvider is an implementation to store the files uploaded on the disk
var streamProvider = new CustomStreamProvider(uploadPath);
var res = await Request.Content.ReadAsMultipartAsync(streamProvider);
streamProvider.FileData.Select(file => new FileInfo(file.LocalFileName)).Select(fi => fi.FullName)

你能告诉我问题出在哪里吗?为什么较大的内容(大于300MB)似乎被不正确地压缩,而较小的内容传输得很好?

请尝试在输入中添加一个名称,如下所示:

<input type="file" id="fileInput" name="fileInput"/>

希望这有帮助…

您是否将文件压缩成块?如果您能够发送未压缩的文件,那么很明显,问题在于您的压缩例程。使用gzip或Deflate开箱即用对文件大小有限制。因此,您需要分块压缩

提示: 调试压缩例程。试着压缩你的文件并保存到硬盘上,看看它是否可读


看看这个

检查什么是内容长度,HTTP服务器端例程不希望您发送不同的内容长度。您可能正在发送原始文件大小的内容长度,否则您将发送压缩内容,而多部分解析器希望数据等于内容长度

取而代之的是,您发送一个压缩文件并在服务器端将其解压缩,让压缩和解压缩在应用程序级别有所不同,而不是插入http协议


您必须确保两侧的压缩/解压缩顺序和内容长度正确。据我所知,在HTTP协议中,上传压缩并不常见。

谢谢您的回答。我已经遇到了两种解决方案:为所有传输完成的文件命名。至于另一个解决方案:以前试过,现在又试过。我使用FileStream处理请求,因为使用MemoryStream会导致OutOfMemoryException。仍然没有什么变化:上传300MB以下的数据有效,上传更大的内容会导致上面提到的错误:(文章被删除了!
Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
MemoryStream tempStream = new MemoryStream();
reqStream.CopyTo(tempStream);

tempStream.Seek(0, SeekOrigin.End);
StreamWriter writer = new StreamWriter(tempStream);
writer.WriteLine();
writer.Flush();
tempStream.Position = 0;

StreamContent streamContent = new StreamContent(tempStream);
foreach(var header in Request.Content.Headers)
{
    streamContent.Headers.Add(header.Key, header.Value);
}

// Read the form data and return an async task.
await streamContent.ReadAsMultipartAsync(provider);