2

私は jQuery と ajax にかなり慣れていないので、質問があります。私が呼び出すjspで

function downloadDocument(documentId){
    var action = "attachment.do";
    var method = "downloadDocument";
    var url = action + "?actionType="+method+"&documentId=" + documentId;
    $.ajax({
          url: url,
          dataType: "json",
          type: 'POST',
          success: function(data){
              alert("downloaded!");
          },
          error: function (request, status, error) {
              alert(request.responseText);
            }
    });

次に、サーブレットで私は

public void downloadDocument(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws IOException{

    AttachmentActionForm form = (AttachmentActionForm)actionForm;

    ServletOutputStream out = response.getOutputStream();

    try{
        // Get the downloadFileName, the name of the file when it will be downloaded by user
        String downloadFileName = "hello.txt";

        String  mimetype = "application/x-download"

        // Get the byte stream of the file
        FileInputStream in = new FileInputStream(Global.ATTACHMENTS_SHARED_FOLDER_PATH + downloadFileName);

        // Print out the byte stream
        byte[] buffer = new byte[4096];
        int length;
        while ((length = in.read(buffer)) > 0){
            out.write(buffer, 0, length);
        }

        response.addHeader("Content-Disposition", "attachment; filename="+downloadFileName);
        response.setHeader("Content-Length", Integer.toString(length));
        response.setContentType(mimetype);  

        in.close();
    }
    catch(Exception e){
        response.setContentType("text/text;charset=utf-8");
        response.setHeader("cache-control", "no-cache");
        System.out.println(e.getMessage());
        out.println(e.getMessage());
    }finally{
        out.flush();
    }
}

しかし、ajax関数では、メッセージがファイル内の文字列で構成されていても、エラーメッセージが表示されるたびに成功することはありません。私に何ができる?

4

2 に答える 2

2

オプションを削除するdataType: "json",と、デバッグ情報が表示されます。

ちなみに、必要を満たすjQueryオプションがあります。

$.fileDownload('some/file.pdf')
    .done(function () { alert('File download a success!'); })
    .fail(function () { alert('File download failed!'); })

この回答から取得: https://stackoverflow.com/a/9970672/1420186

編集:

あなたのJSP

function downloadDocument(documentId){
    var action = "attachment.do";
    var method = "downloadDocument";
    var url = action + "?actionType="+method+"&documentId=" + documentId;
    $.ajax({
          url: url,
          dataType: "text", // Change dataType to "text"
          type: 'POST',
          success: function(data){
              if (data == "FAIL") {
                  alert("File not found!");
              } else {
                  window.location.href = data; // Download the file
              }
          },
          error: function (request, status, error) {
              alert("The request failed: " + request.responseText);
          }
    });
}

サーブレットでは、ファイルが存在しない場合は「FAIL」文字列を返し、そうでない場合はファイル URL を返します。

それが役立つことを願っています。

于 2013-10-29T14:30:16.473 に答える
1

Ajax 呼び出しを使用しない // 隠しフォーム アプローチを使用する

<form action='../servletname' method='POST' id='formid'>
                <input type='hidden' value='' name='name' id='id'/>
                <input type='hidden' value=' ' name='name'  id='id' />
            </form>

ボタンをクリックしてフォームを送信

$('#formid').submit(); 

サーブレットで

response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment; filename=filnemae.fileformat");

 ServletOutputStream out = res.getOutputStream();

出力ストリームに書き込み、閉じるかフラッシュする

server.xml で post update postsize を介して大きなデータを送信している場合

于 2017-07-27T13:00:37.017 に答える