当前位置: 首页 > 面试题库 >

如何使用Jquery从httpServlet下载文件?

唐海阳
2023-03-14
问题内容

在我的应用程序中,在客户端创建了一个json对象。该对象被发布到HttpServlet,后者基于POST数据创建pdf文件。

该文件将发送回用户。调用成功函数,并记录流数据。但是,我想要下载该文件。

如何实现呢?

我的客户端代码:

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

});

然后servlet创建文件:

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

日志中的输出:

%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
  • 我的解决方案:*

有关指针,请参见http://www.particletree.com/notebook/ajax-file-download-or-
not/

我创建了一个带有一个隐藏字段的表单:

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

比我将我的jquery post数据控制器更改为:

    $('#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();

});

所以现在当我单击“导出”按钮时,表单中的隐藏字段获取要发布的数据,并且数据以www-form编码形式发布。

这样,servlet可以处理请求并将文件下载到客户端。


问题答案:

您无法使用Ajax下载文件。出于明显的安全原因,JavaScript没有任何功能可以触发与JavaScript上下文中任意检索/生成的内容的“ 另存为”
对话框。如果可以的话,万维网看起来会大不相同。

如果您坚持要使用JS / jQuery,则需要发送syncnus
GET请求。您可以使用window.location(只需重命名doPost()doGet())来执行此操作。

window.location = 'pdfServlet?param1=value1&param2=value2';

另外,只需丢弃所有不必要的JS / jQuery,然后将纯HTML <form action="pdfServlet" method="post">与结合使用即可<input type="submit">。额外的好处是它可以在禁用JS的浏览器中使用。

如果您获取ajax的唯一原因实际上是为了避免刷新页面而天真的尝试,那么我可以告诉您,如果响应中包含Content-Disposition: attachment标头,则实际上不会发生这种情况。因此该部分已经安全



 类似资料:
  • 我正在使用Qt框架编写一个C应用程序,该应用程序需要从源锻造下载文件。 我必须下载这个文件https://sourceforge.net/projects/meshlab/files/updates/1.3.3/updates.xml 我使用Qt和QHttp类编写了以下代码: QHttp::设置主机和 QHttp::获取都不会阻止函数立即返回一个整数 ID。当 http 文件传输完成后,将自动调用

  • 问题内容: 我在这里指定了非常相似的要求。 我需要让用户的浏览器在以下情况下手动开始下载 但是我无法使用该方法,因为它将当前页面内容替换为您尝试下载的文件。 相反,我想在新窗口/选项卡中打开下载。这怎么可能? 问题答案: 使用不可见的: 要强制浏览器下载本来可以呈现的文件(例如HTML或文本文件),则需要服务器将文件的MIME类型设置为无意义的值,例如或另外,用于任意二进制数据。 如果只想在新标签

  • 问题内容: 我想下载一个jQueryajax响应的pdf文件。Ajax响应包含pdf文件数据。。我的代码在下面给出,但是我总是得到一个空白的pdf。 问题答案: jQuery使用AJAX请求加载二进制数据时存在一些问题,因为它尚未实现某些HTML5 XHRv2功能 鉴于此,您拥有以下两种解决方案之一: 第一个解决方案是放弃JQuery并使用XMLHTTPRequest 与本地HTMLHTTPReq

  • 问题内容: 我想使用ajax功能进行下载,从而用户将单击下载链接,该链接将(使用ajax和$ _GET)访问一个PHP文件,该PHP文件将处理发送的$ _GET变量并访问正确的文件进行下载。 我有一些PHP脚本来处理$ _GET变量的处理,这些变量可以单独工作,但是使用Ajax访问时,它们将停止工作。 我正在使用的Ajax / PHP代码如下: 请仔细阅读我的代码,帮助我找到我做错了什么。 谢谢

  • 问题内容: 我需要将文件从服务器下载到桌面。(UBUNTU 10.04)我没有Web访问服务器,只是ssh。 如果有帮助,我的操作系统是Mac OS X和iTerm 2作为终端。 问题答案: 在您的终端中,键入: 相应地替换用户名,主机,远程文件名和本地目录。 如果要访问EC2(或其他需要使用私钥进行身份验证的服务),请使用以下选项: