我有一个Web应用程序,允许用户从服务器下载图像文件。当用户点击jsp页面上的按钮时,会发出ajax post请求,该请求执行servlet并作为响应发送图像文件。但问题是图像文件永远不会下载,并且“另存为”对话框不会出现。
在Firebug中,我可以看到请求是正确发送的,并且收到了正确的Contect Type和状态代码200的响应。我还可以在firebug Response选项卡中看到二进制数据,但由于某种原因仍无法下载图像。请帮助。
请求:
*请求网址:http://localhost:8080/SVGToImage/convertToImg
请求方法:POST
状态代码:200 OK *
响应:
*内容处置:文件名= “out.jpg”
内容类型:image / JPEG
日期:2013年5月31日星期五17:28:26 GMT
服务器:Apache-狼/ 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();
}
由于
答案 0 :(得分:2)
您无法使用ajax下载文件。 Ajax由JavaScript语言执行。出于明显的安全原因,JavaScript语言无法以编程方式触发另存为对话框并提供任意文件内容。
只需通过非ajax请求下载即可。如果Content-Disposition
标头设置为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 / Servlets完全无关。