Así que he estado haciendo esto durante unos días y me encuentro con un problema. Estoy tratando de hacer una llamada ajax que envíe un byte[] al controlador en C#.
var data = { FtpUpload: self.Upload(), Attachment: self.Attachment() }; Base.ServiceCall("/Home/Upload", "post", data, true, function (response) {...}self.Attachment() contiene una propiedad para el 'byte[]'. Estoy usando esto para leer la matriz de bytes del archivo que funciona según lo planeado.
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); };Cuando hago esto con un archivo de 17 mb, funciona bien, pero cuando lo hago con un archivo de 109 mb, arroja un error 500 que dice esto.
[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() +14He agregado la configuración adecuada a mi web.config para permitir archivos más grandes como este.
<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>No estoy seguro de qué más hacer.
Según el seguimiento de la pila, su llamada está fallando dentro HttpEncoder.UrlDecode , lo cual solo es posible si está enviando su imagen como application/x-www-form-urlencoded que puede o no ser la mejor opción cuando se trata de datos binarios pesados. .
Independientemente del tipo de contenido que elija usar, tendrá que volver a implementar su acción de publicación usando el parámetro HttpPostedFileBase que le proporciona el método InputStream.Read en lugar de esperar el byte[] del formulario de solicitud, consulte a continuación.
[HttpPost] public JsonResult Upload(HttpPostedFileBase uploadedFile) ... byte[] fileByteArray = new byte[uploadedFile.ContentLength]; uploadedFile.InputStream.Read(fileByteArray, 0, uploadedFile.ContentLength); ... Puede ver en el ejemplo que el parámetro de acción tiene que ser HttpPostedFileBase para transmitir el archivo en lugar de enviar/recibir como una matriz completa de datos binarios.
Eche un vistazo al siguiente proyecto a continuación https://www.codeproject.com/Articles/1021004/Upload-File-Using-Ajax-And-HTML-in-MVC