0

我有一个 Web 应用程序,可让用户从服务器下载图像文件。当用户点击 jsp 页面上的按钮时,会发出一个 ajax 发布请求,该请求执行一个 servlet 并作为响应发送一个图像文件。但问题是图像文件永远不会下载并且另存为对话框没有出现。

在 Firebug 中,我可以看到请求已正确发送,并且收到了正确的 Contect Type 和状态代码 200 的响应。我还可以在 firebug 响应选项卡中看到二进制数据,但由于某种原因,图像仍然没有下载。请帮忙。

请求: *请求网址:http://localhost:8080/SVGToImage/convertToImg

请求方法:POST

状态码:200 OK*

回复:

*内容处置:文件名=“out.jpg”

内容类型:图像/JPEG

日期:格林威治标准时间 2013 年 5 月 31 日星期五 17:28:26

服务器:Apache-Coyote/1.1

传输编码:分块*

这是我的 JSP

<head>

<script>

    function exportToImage(){

    var svg = document.getElementById("ext-gen1040");       

    var svg1 = new XMLSerializer().serializeToString(svg);

        jQuery.noConflict();

        jQuery.ajax({
            url: "convertToImg" ,
            type: "POST",
                    data: { q = svg1},
            success: function(data) {               
            },
          error: function(jqXHR, textStatus, errorThrown) {
              alert('Error ' + textStatus);
          }     
});

</script>

</head>

<body>
<input type="button" value="export" onclick="javascript:exportToImage();">
</body>

在服务器端,这里是 servlet 代码:

private void doPost(HttpServletRequest request,
        HttpServletResponse response)  throws ServletException, IOException {
    // TODO Auto-generated method stub

    String filePath = "C:/Users/nandan.jain/Pictures/out.jpg";
    File file = new File(filePath);
    int length   = 0;
    ServletOutputStream outStream = response.getOutputStream();

    response.setContentType("image/jpeg");
    response.setContentLength((int)file.length());
    String fileName = (new File(filePath)).getName();

    // sets HTTP header
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

    byte[] byteBuffer = new byte[BUFSIZE];
    DataInputStream in = new DataInputStream(new FileInputStream(file));

    // reads the file's bytes and writes them to the response stream
    while ((in != null) && ((length = in.read(byteBuffer)) != -1))
    {
        outStream.write(byteBuffer,0,length);
    }

    in.close();
    outStream.close();


}

谢谢

4

1 回答 1

3

您不能使用 ajax 下载文件。Ajax 由 JavaScript 语言执行。由于明显的安全原因,JavaScript 语言没有以编程方式触发“另存为”对话框并提供任意文件内容的工具。

只需通过非 ajax 请求下载即可。如果Content-Dispositionheader 设置为attachment,则当前页面将保持不变。

所以,而不是整个jQuery.ajax()事情,你可以做

window.location = "convertToImg?q=" + encodeURIComponent(svg1);

并在 servlet 中执行这项工作doGet()

或者,如果您确实需要 POST,则将其设置为普通的提交表单。

<form action="convertToImg" method="post">
    <input type="hidden" name="svg1" />
    <input type="submit" onclick="exportToImage(this)" />
</form>

function exportToImage(button) {
    var svg = document.getElementById("ext-gen1040");       
    var svg1 = new XMLSerializer().serializeToString(svg);
    button.form.svg1.value = svg1;
}

请注意,具体问题与 JSP/Servlet 完全无关。

于 2013-05-31T18:03:34.960 回答