“Error al construir ‘Blob’: el valor proporcionado no se puede convertir en una secuencia” al descargar el archivo

1 minuto de lectura

Estoy tratando de descargar y guardar un archivo PDF usando ajax/jquery (lo sé…).

Esto es lo que tengo en el lado del servidor:

        public HttpResponseMessage GetPdf()
        {
            var pdf = generatePdfByteArray(); // byte[]

            var result = Request.CreateResponse(HttpStatusCode.OK);
            result.Content = new ByteArrayContent(pdf);
            //result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            //{
            //    FileName = "blah.pdf"
            //};
// tried with and without content disposition.. shouldn't matter, i think?
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

            return result;
        }

Este es el lado del cliente:

    let ajaxOptions = {
    url: '/url',
    type: "GET",
    accepts: "application/pdf",
    success: (data) => {
        let blob = new Blob(data, {
            type: "application/pdf"
        }); // <-- this fails

        // stuff...
    }
};
$.ajax(ajaxOptions);

¿Alguna idea de lo que está mal con esto?

  • por qué desea que el blob sea simple, simplemente haga clic en el ancla o en el botón que está llamando a la API, el resto lo hará el navegador

    – Negi Rox

    13 de marzo de 2019 a las 3:32

  • Porque quiero interceptar la llamada y mostrar un mensaje si algo sale mal en el servidor

    – Thinkhoop

    13 de marzo de 2019 a las 13:39

El primer parámetro debe ser secuencia.

Por lo tanto, esto no funcionará:

let blob = new Blob(data, {
    type: "application/pdf"
});

Pero esto:

let blob = new Blob([data], {
    type: "application/pdf"
});

Esto es con lo que terminé:

public HttpResponseMessage GetPdf()
{
    var pdf = generatePdfByteArray();

    var result = Request.CreateResponse(HttpStatusCode.OK);
    var dataStream = new MemoryStream(pdf);
    result.Content = new StreamContent(dataStream);
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = "file.pdf"
    };
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

    return result;
}

¿Ha sido útil esta solución?