2016-08-09 4 views
0

사용자가 파일 (docx 또는 pdf 파일)을 다운로드 할 수있는 웹 서비스가 있습니다. 이 코드 조각이 나타냅니다jersey와 Ajax를 사용하여 Jersey에서 파일 가져 오기

$(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"*/ 
       }); 
      }); 
      ... 

: 다른 측면에서

@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(); 
} 

을, 나는이 같은 jQuery를 3 원시 아약스 호출을 사용하여 일반 HTML + JS로 작성된 클라이언트를 가지고 이를 실행하면 다음과 같은 메시지가 콘솔에 출력됩니다. characters

인코딩과 관련된 코드 줄을 주석 처리해도 아무런 변화가 없습니다. 다운로드 할 파일을 제공 할 때 파일이 손상된 것입니다 (실제로 17KB 일 때 파일 크기는 25KB입니다). 나는 다른 출력을 얻을 이유

나는 모르고, 비누 UI에서 그것을 시도했습니다 내 질문이 내 아약스 호출에서 뭔가 잘못하고있는 중이 야한다 soap ui response

? 내가 얻은 데이터는 바이너리 인 것처럼 보이지만 브라우저에서 비누 UI와 다른 점이 무엇인지 모르겠습니다.

답변

0

나는 직접 답변을 찾았습니다. 지연으로 인해 Ajax 요청을 구현하는 다른 방법을 찾았으므로 원시 XMLHttpRequest를 사용하기로 결정했습니다. 파일을 다운로드하려면 download.js 라이브러리를 사용했습니다.

은 간단히 다음과 같이

var oReq = new XMLHttpRequest(); 
oReq.open("GET", tgt, true); 
oReq.setRequestHeader("nombre_apellidos", "Mike Poborsky"); 
oReq.setRequestHeader("domicilio", "St. Mary 4"); 
oReq.setRequestHeader("codigo_postal", "123"); 
oReq.setRequestHeader("localidad", "Julapa"); 
oReq.setRequestHeader("provincia", "Asada"); 
oReq.setRequestHeader("linea", "SBD0345"); 
oReq.setRequestHeader("operador", "Yay"); 
oReq.setRequestHeader("mensaje", "Recarga no funciona"); 
oReq.responseType = "blob"; 
oReq.onload = function(oEvent) { 
    download(oReq.response, "explicacion_operador_ticket_666.docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
}; 
oReq.send(); 
관련 문제