Jak pobrać plik z httpServlet za pomocą Jquery?

W mojej aplikacji obiekt json jest tworzony po stronie klienta. Ten obiekt jest wysyłany do HttpServlet, który tworzy plik pdf na podstawie danych POST.

Plik jest odsyłany do użytkownika. Wywoływana jest funkcja succes, a dane strumienia są rejestrowane. Chcę jednak, aby plik został pobrany.

Jak to osiągnąć?

Mój kod klienta:

$(document).ready(function() {
// when the print button is clicked
$('#exportButton').click(function() {

    var tableIdx = performanceDetailTableController.getTableIdx();

    var allData = {
        "shipTable1":{
            "rows":[
                {  "latitude":"12323","longitude":"213213"},
                {  "latitude":"213213","longitude":"543543"}
            ]},
        "shipTable2":{
            "rows":[
                {  "latitude":"12323", "longitude":"213213"},
                {  "latitude":"213213","longitude":"543543"}
            ]}
        }

    var postData = JSON.stringify(allData);

    $.ajax({
        type : "POST",
        url : 'pdfServlet',
        contentType: "application/json; charset=utf-8",
        data : postData,
                    async : false,
        success : function(data) {
            alert("got some data");
            console.log(data);
        },
    });
});

});

A serwlet tworzący plik:

@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

    // get the json content
    StringBuffer jsonContent = getPostedContent(request);

    log.info(jsonContent.toString());

    // convert json to pojo's
    Tables tables = getTablesFromString(jsonContent);

    // create a xml stream
    ByteArrayOutputStream xml = new XmlConverter().getXMLSource(tables);

    // put the xml on the request
    request = setXmlOnRequest(request, xml);

    // create pdf data of the pdf-able xml content
    ByteArrayOutputStream pdf = new PdfHandler().createPdfDataStream(request);

    // response = createResponseheaders(response, request);
    response.setContentType("application/pdf");
    response.setContentLength(pdf.size());
    response.setHeader("Content-disposition", "attachment; filename=test.pdf");
    response.setCharacterEncoding("utf-8");
    response.getOutputStream().write(pdf.toByteArray());

    //close the streams
    pdf.close();
    response.getOutputStream().close();
}

Wyjście w dzienniku:

%PDF-1.4
%
4 0 obj
<<
/Producer (Apache FOP Version SVN branches/fop-0_95)
/CreationDate (D:20130725162007+02'00')
>>
endobj
5 0 obj
<<
  /N 3
  /Length 11 0 R
  /Filter /FlateDecode
>>
stream
xwTSϽ7PhRHH.*1  J 

*MOJE ROZWIĄZANIE: *

widziećhttp://www.particletree.com/notebook/ajax-file-download-or-not/ dla wskaźnika

Utworzyłem formularz z jednym ukrytym polem:

        <button id="exportButton">export</button>
    <form id="exportForm" method="post" action="pdfServlet">
        <input type="hidden" value="empty" id="pdf_data" name="pdf_data" />
    </form>

niż zmieniłem mojego kontrolera danych jquery na:

    $('#exportButton').click(function() {

    var tableIdx = performanceDetailTableController.getTableIdx();

        var allData = {
        "shipTable1":{
            "rows":[
                {  "latitude":"12323","longitude":"213213"},
                {  "latitude":"213213","longitude":"543543"}
            ]},
        "shipTable2":{
            "rows":[
                {  "latitude":"12323", "longitude":"213213"},
                {  "latitude":"213213","longitude":"543543"}
            ]}
        } 



    var postData = JSON.stringify(allData);

    // put the data on the hidden form field in the export form
    $('#pdf_data').val(postData);

    // and submit the form
    $('#exportForm').submit();

});

więc teraz, gdy kliknę przycisk eksportu, ukryte pole w formularzu powoduje, że dane są publikowane, a dane są publikowane jako zakodowane w formie www.

W ten sposób serwlet może obsłużyć żądanie, a plik zostanie pobrany do klienta.

questionAnswers(1)

yourAnswerToTheQuestion