jQuery ajax表单提交用于返回文件的未定义错误响应

时间:2018-11-21 04:52:59

标签: javascript jquery ajax

由于文件操作安全性的各种问题,我被迫通过Ajax post方法调用提交请求。服务器端URL收到此消息并给出pdf文件作为响应。 Java servlet中的服务器端代码如下。

            ServletOutputStream out = response.getOutputStream();
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment;filename=" + outFile);
        //create the pdf file
        response.flushBuffer();

在客户端,JavaScript代码正在将呼叫发送到POST,该POST通过doPost调用上述代码。通过form.submit()提交表单时,该文件可以很好地下载为pdf文件。当尝试通过Ajax调用时,它在错误部分下给了我未定义的响应。客户端代码如下。

    var formData = new FormData();
//Fill formData with fields and files
    console.log('Posting form from ajax');
    $.ajax({
        url: "/createPdf",
        type: "POST",
        data: formData,
        contentType: false,
        processData: false,
        xhrFields: {
            responseType: 'blob'
        },
        success: function (response, status, xhr) {
            console.log('Processing response');
            download(response, "merged.pdf", "application/pdf" );

        },
        error: function (xhr, status, error) 
        { 
            var err = xhr.responseText; 
            alert(err); 
        }

在上面,它没有得到成功响应。它正在发生错误和未定义的警报。我在这里做错了。如果重要的话,我的jquery版本是1.8.0.min.js。下载功能指的是http://danml.com/download.html,但我也尝试了其他代码片段,但都没有成功。

在“检查”工具下,我看到了成功请求和响应的blob数据,但是要在浏览器的“网络”下显示blob数据大约需要10-15秒。

请帮助。我整个晚上都在看,似乎无法找出不确定的答案。

2 个答案:

答案 0 :(得分:-1)

对于ajax下载,您应该动态添加链接,触发点击,然后删除。

var formData = new FormData();
//Fill formData with fields and files
    console.log('Posting form from ajax');
    $.ajax({
        url: "/createPdf",
        type: "POST",
        data: formData,
        contentType: false,
        processData: false,
        xhrFields: {
            responseType: 'blob'
        },
        success: function (response, status, xhr) {
             var a = document.createElement('a');
            var url = window.URL.createObjectURL(response);
            a.href = url;
            a.download = 'myfile.pdf';
            a.click();
            window.URL.revokeObjectURL(url);
        },
        error: function (xhr, status, error) 
        { 
            var err = xhr.responseText; 
            alert(err); 
        }

答案 1 :(得分:-2)

您在form.submit()中提到它可以正常工作。您使用的是POST还是GET类型? I World尝试在您的Ajax请求中更改它。我不是Java专业人士,但也许您的Servlet只响应GET请求。当我使用Ajax和Servlet时,我使用了http Servlet重写了doGet方法。