使用jQuery和Ajax从Jersey获取文件

时间:2016-08-09 10:09:47

标签: jquery ajax web-services character-encoding

我有一个网络服务,用户可以使用该服务下载文件(docx或pdf文件)。这段代码代表了它:

@GET
@Path("explicacionOperador/explicacion_operador_ticket_{id_ticket}.pdf")
@Produces("application/pdf")
public Response generarDocumentoExplicacionOperadorPostPdf(
    @PathParam("id_ticket") String pTicketId,
    @HeaderParam("nombre_apellidos") String nombre_apellidos,
    @HeaderParam("domicilio") String domicilio,
    @HeaderParam("codigo_postal") String codigo_postal,
    @HeaderParam("localidad") String localidad,
    @HeaderParam("provincia") String provincia,
    @HeaderParam("linea") String linea,
    @HeaderParam("operador") String operador,
    @HeaderParam("mensaje") String mensaje
) throws IOException, ConfigurationException, URISyntaxException, FormatoNoSoportadoException{
    ETipoDocumento tipo = FormatoNoSoportadoException.testFormato("pdf");
    File documentoExplicacionOperador = this.generalService.getDocumentoExplicacionOperador(
            tipo, 
            pTicketId, 
            nombre_apellidos, 
            domicilio, 
            codigo_postal, 
            localidad, 
            provincia, 
            linea, 
            operador, 
            mensaje);
    return Response
            .ok(documentoExplicacionOperador, MediaType.APPLICATION_OCTET_STREAM)
            .header("Content-Disposition", "attachment; filename=\"" + documentoExplicacionOperador.getName() + "\"" )
            .header("Charset", "ISO-8859-1")
            .build();
}

另一方面,我使用简单的HTML + JS编写了一个客户端,使用类似这样的jQuery 3 raw ajax调用:

$(document).ready(function(e){

            $("#dale").click(function(e){
                e.preventDefault();
                var tgt = "resources/documentos/explicacionOperador/explicacion_operador_ticket_666.docx";
                $.ajax({
                    url: tgt,
                    type: 'GET',
                    //mimeType: "application/octet-stream",
                    //contentType: 'application/octet-stream; charset=ISO-8859-1',
                    //async: true,
                    processData: false,
                    success: //download.bind(true, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "explicacion_operador_ticket_666.docx"),
                        function(data){
                            console.log(data);
                        },
                    error: function(data){
                        var elError = "Error al hacer la llamada a " + tgt + ": " + data;
                        console.log(elError);
                        console.log(data);
                        alert(elError);
                    },
                    headers: {
                        nombre_apellidos: "Mike Poborsky",
                        domicilio: "St. Mary 4",
                        codigo_postal: "194",
                        localidad: "Julapa",
                        provincia: "Asada",
                        linea: "SB64533",
                        operador: "Julandrin",
                        mensaje: "Recarga no funciona"
                    }/*,
                    scriptCharset: "ISO-8859-1"*/
                });
            });
            ...

执行时,会在控制台中打印出这样的消息: characters

当我注释掉与编码相关的代码行时,没有任何变化。显然,当我提供文件进行下载时,文件已损坏(文件为25KB,实际上为17KB)。

我已经在Soap UI中尝试过了,不知道为什么,我得到了不同的输出: soap ui response

我的问题是我在ajax电话中做错了什么?我得到的数据似乎是二进制的,但我不知道为什么它与Soap UI相比在浏览器中有所不同。

1 个答案:

答案 0 :(得分:0)

我自己找到了答案。由于延迟,我寻找其他方法来实现Ajax请求,所以我决定使用原始的XMLHttpRequest ......它有效!要下载该文件,我已使用download.js库。

简单如下:

\3