2017-04-11 32 views
1

所以我一直在這樣做了幾天,並且遇到了一個問題。我試圖做一個Ajax調用,發送一個字節[]到控制器在C#中。嘗試從js發送100mb字節數組到使用ajax的c#時發生錯誤

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的文件,它工作正常,但如果我這樣做了了109M的文件,它拋出一個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> 

林不知道該怎麼辦。

+0

一起來看看下面的項目因爲你得到一個內存不足的異常,我懷疑這不是你的配置問題。你能發佈接收數據的網站方法嗎?我懷疑問題在那裏。因爲你得到一個錯誤500,這意味着它發生在服務器上,所以它不是你引發這個異常的JavaScript。 – Lorien

+0

如果你想要一個字節數組,你應該考慮使用'reader.readAsArrayBuffer()'。 'readAsDataURL'將base64編碼你的文件,這可以大大增加數據的大小。 –

+0

「如果你想要一個字節數組,你應該考慮使用reader.readAsArrayBuffer()。」我試過這個,但字節數組在後端作爲null來傳遞。我試圖將數組緩衝區傳遞給一個byte []。我需要先把它轉換成任何東西嗎? – NormTheThird

回答

0

根據堆棧跟蹤,您的呼叫在HttpEncoder.UrlDecode內失敗,這隻有在您發送圖像爲application/x-www-form-urlencoded時纔有可能,因爲在處理繁重的二進制數據時這可能是最佳選擇。

不管內容類型的選擇使用你將不得不使用HttpPostedFileBase參數,它爲您提供了InputStream.Read方法,而不是從申請表期待byte[]重新實現你的動作後,見下文。

​​3210

你可以看到的例子,該動作參數必須以流文件,而不是發送/接收作爲二進制數據的整個陣列HttpPostedFileBase

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

+0

我試過了,它仍然無法工作。不管怎麼說,多謝拉。 – NormTheThird

+0

在這種情況下,您應該獲得另一個異常堆棧跟蹤。你能檢查嗎? –

+0

[OutOfMemoryException:拋出'System.OutOfMemoryException'類型的異常。] System.Web.Util.HttpEncoder.UrlDecode(Byte [] bytes,Int32 offset,Int32 count,Encoding encoding)+76 System.Web.HttpValueCollection。 FillFromEncodedBytes(字節[]字節,編碼方式進行編碼)164 System.Web.HttpRequest.FillInFormCollection()77 – NormTheThird

相關問題