尝试使用ajax从js向c#发送100mb字节数组时出错

时间:2017-04-11 20:05:45

标签: javascript c# ajax asp.net-mvc

所以我已经在这几天了,我遇到了一个问题。我试图进行ajax调用,在c#中向控制器发送一个byte []。

var data = { FtpUpload: self.Upload(), Attachment: self.Attachment() };
Base.ServiceCall("/Home/Upload", "post", data, true, function  (response) {...}

self.Attachment()包含' byte []'的属性。我正在使用它从文件中读取字节数组,该文件按计划工作。

self.OnImageUpload = function (vm, evt) {
  var file = evt.target.files[0];
  var reader = new FileReader();

  reader.onload = function () {
    var attachment = {
      ...
      Attachment: reader.result.split(',')[1]
    };
    self.Attachment(attachment);
  }

  reader.readAsDataURL(file);
};

当我使用17mb文件执行此操作时,它可以正常工作但是当我使用109mb文件执行此操作时,会抛出500错误,说明这一点。

[OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.]
   System.Web.Util.HttpEncoder.UrlDecode(Byte[] bytes, Int32 offset, Int32 count, Encoding encoding) +76
   System.Web.HttpValueCollection.FillFromEncodedBytes(Byte[] bytes, Encoding encoding) +164
   System.Web.HttpRequest.FillInFormCollection() +77

[HttpException (0x80004005): The URL-encoded form data is not valid.]
   System.Web.HttpRequest.FillInFormCollection() +130
   System.Web.HttpRequest.EnsureForm() +69
   System.Web.HttpRequest.get_Form() +13
   System.Web.HttpRequestWrapper.get_Form() +14

我已将正确的设置添加到我的web.config中,以允许更大的文件,如此。

<system.web>  
  <httpRuntime targetFramework="4.6" maxRequestLength="2147483647" executionTimeout="1600" requestLengthDiskThreshold="2147483647" />
</system.web>

<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="2147483647" />
    </requestFiltering>
  </security>
</system.webServer>

我不知道还能做什么。

1 个答案:

答案 0 :(得分:0)

基于堆栈跟踪,您的呼叫在HttpEncoder.UrlDecode内失败,这只有在您将图像作为application/x-www-form-urlencoded发送时才有可能,当您处理重二进制时,这可能是也可能不是最佳选择数据

无论您选择使用哪种内容类型,都必须使用HttpPostedFileBase参数重新实施您的帖子操作,该参数为您提供InputStream.Read方法,而不是期望byte[]来自请求表格,见下文。

[HttpPost]
public JsonResult Upload(HttpPostedFileBase uploadedFile)
...
byte[] fileByteArray = new byte[uploadedFile.ContentLength];
uploadedFile.InputStream.Read(fileByteArray, 0, uploadedFile.ContentLength);
...

您可以在示例中看到action参数必须是HttpPostedFileBase才能流式传输文件,而不是作为整个二进制数据数组发送/接收。

看看下面的以下项目 https://www.codeproject.com/Articles/1021004/Upload-File-Using-Ajax-And-HTML-in-MVC