Java jQuery.ajax servlet 返回一个文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19661011/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 19:13:45  来源:igfitidea点击:

jQuery.ajax servlet return a file

javajqueryajaxservlets

提问by MarkWarriors

I'm pretty new to jQuery and ajax and i have a question. In a jsp I call

我对 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);
            }
    });

then in the servlet I do

然后在我做的servlet

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

But in the ajax function, I never get a success, all the time I get the error message, even if the message is composed by the string inside of the file. What can I do?

但是在ajax函数中,我从来没有成功过,我一直收到错误消息,即使消息是由文件内部的字符串组成的。我能做什么?

采纳答案by abhinavxeon

dont use Ajax call use //use hidden form approach

不要使用 Ajax 调用 use //使用隐藏表单方法

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

on click of button submit form

单击按钮提交表单

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

in servlet

在小服务程序中

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

 ServletOutputStream out = res.getOutputStream();

write on ouput stream then close or flush

在输出流上写入然后关闭或刷新

if you are sending large data through post update postsize in server.xml

如果您通过 server.xml 中的 post update postsize 发送大数据

回答by TrungDQ

Remove your dataType: "json",options and you will see some debug informations.

删除您的dataType: "json",选项,您将看到一些调试信息。

By the way, there is a jQuery option that meet you need:

顺便说一下,有一个 jQuery 选项可以满足您的需求:

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

Taken from this answer: https://stackoverflow.com/a/9970672/1420186

取自这个答案:https: //stackoverflow.com/a/9970672/1420186

EDIT:

编辑:

Your JSP

您的 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);
          }
    });
}

In your Servlet, if the file is not exists, just return a "FAIL" string, else return the file URL.

在您的 Servlet 中,如果文件不存在,只需返回“FAIL”字符串,否则返回文件 URL。

Hope that helps.

希望有帮助。