none
Asignar a input con tipo bytes[] archivo upload subido y convertido a bytes[] RRS feed

  • Pregunta

  • Hola:

    En el formulario tengo un input typo file en el cual se selecciona un fichero y mediante ajax lo convierto a bytes y lo quiero pasar al input de la vista, pero siempre aparece nulo.

    El código que tengo es el siguiente:

    Visa:

     <div class="form">
                    <div class="col-12">
                        @Html.Label("Seleccionar Factura PDF", htmlAttributes: new { @class = "control-label col-md-12" })
                        <div class="col-7 text-right bg-light rounded text-dark my-auto">
    
                            @Html.HiddenFor(model => model.ArchivoBytes)
                            @Html.TextBoxFor(model => model.files, "", new { @type = "file" })
                            @Html.ValidationMessageFor(model => model.files, "", new { @class = "text-danger" })
                            
                        </div>
                    </div>
                </div>

    el código jquery es:

    $('#files').on('change', function (e) {
        var files = e.target.files;
        //var myID = 3; //uncomment this to make sure the ajax URL works
        if (files.length > 0) {
            if (window.FormData !== undefined) {
                var data = new FormData();
                for (var x = 0; x < files.length; x++) {
                    data.append("file" + x, files[x]);
                }
    
                $.ajax({
                    type: "POST",
                    url: '/FacturasR/CargarPDF',
                    contentType: false,
                    processData: false,
                    data: data,
                    success: function (result) {
                        console.log(result);
                        //fileByteArray.push(result);
                        $('#ArchivoBytes').val(result);
                    },
                    error: function (xhr, status, p3, p4) {
                        var err = "Error " + " " + status + " " + p3 + " " + p4;
                        if (xhr.responseText && xhr.responseText[0] == "{")
                            err = JSON.parse(xhr.responseText).Message;
                        console.log(err);
                    }
                });
            } else {
                alert("This browser doesn't support HTML5 file uploads!");
            }
        }
    });
    

    En el controlador tengo el siguiente código:

     public JsonResult CargarPDF()
            {
    
                try
                {
                    byte[] _fileBytes = null;
    
                    foreach (string file in Request.Files)
                    {
    
    
                        var fileContent = Request.Files[file];
                        if (fileContent != null && fileContent.ContentLength > 0)
                        {
                            String FileExt = Path.GetExtension(fileContent.FileName).ToUpper();
                            if (FileExt == ".PDF")
                            {
                                // get a stream
                                Stream stream = fileContent.InputStream;
    
                                BinaryReader Br = new BinaryReader(stream);
                                _fileBytes = Br.ReadBytes((Int32)stream.Length);
                                
                            }
    
                        }
                    }
                    return Json(_fileBytes, JsonRequestBehavior.AllowGet);
                }
                catch (Exception)
                {
                    Response.StatusCode = (int)HttpStatusCode.BadRequest;
                    return Json("Upload failed");
                }
    
            }

    El controlador devuelve correctamente el array de bytes, pero al asignarlos a "ArchivoPDF" de la vista cuendo vuelve al controlador figura como null, como si la asignación no fuese correcta:

     $('#ArchivoBytes').val(result);

    Pero al hacerle esta asignacion, se ve que no le asigna el array de bytes y figura como null.

    Un Saludo.

    domingo, 22 de septiembre de 2019 21:05