我在服务器端有一个Struts2动作用于文件下载.
<action name="download" class="com.xxx.DownAction">
<result name="success" type="stream">
<param name="contentType">text/plain</param>
<param name="inputName">imageStream</param>
<param name="contentDisposition">attachment;filename={fileName}</param>
<param name="bufferSize">1024</param>
</result>
</action>
Run Code Online (Sandbox Code Playgroud)
但是当我使用jQuery调用动作时:
$.post(
"/download.action",{
para1:value1,
para2:value2
....
},function(data){
console.info(data);
}
);
Run Code Online (Sandbox Code Playgroud)
在Firebug中我看到使用二进制流检索数据.我想知道如何打开用户可以在本地保存文件的文件下载窗口?
我有一个基于jquery的单页webapp.它通过AJAX调用与RESTful Web服务进行通信.
我正在努力完成以下任务:
我现在有1和2工作,客户端jquery应用程序通过基于JSON数据创建DOM元素来显示网页中返回的数据.从Web服务的角度来看,我也有#3工作,这意味着如果给出正确的JSON参数,它将创建并返回二进制文件.但我不确定在客户端javascript代码中处理#3的最佳方法.
是否有可能从这样的ajax调用中获取可下载的文件?如何让浏览器下载并保存文件?
$.ajax({
type: "POST",
url: "/services/test",
contentType: "application/json",
data: JSON.stringify({category: 42, sort: 3, type: "pdf"}),
dataType: "json",
success: function(json, status){
if (status != "success") {
log("Error loading data");
return;
}
log("Data loaded!");
},
error: function(result, status, err) {
log("Error loading data");
return;
}
});
Run Code Online (Sandbox Code Playgroud)
服务器响应以下标头:
Content-Disposition:attachment; filename=export-1282022272283.pdf
Content-Length:5120
Content-Type:application/pdf
Server:Jetty(6.1.11)
Run Code Online (Sandbox Code Playgroud)
另一个想法是生成PDF并将其存储在服务器上并返回包含该文件的URL的JSON.然后,在ajax成功处理程序中发出另一个调用,执行以下操作:
success: function(json,status) {
window.location.href = json.url;
}
Run Code Online (Sandbox Code Playgroud)
但这样做意味着我需要对服务器进行多次调用,而我的服务器需要构建可下载的文件,将它们存储在某处,然后定期清理该存储区域.
必须有一种更简单的方法来实现这一目标.想法?
编辑:在查看$ .ajax的文档后,我看到响应dataType只能是其中之一xml, html, script, json, jsonp, text,所以我猜测没有办法使用ajax请求直接下载文件,除非我在使用中嵌入二进制文件@VinayC答案中建议的数据URI方案(这不是我想做的事情).
所以我想我的选择是:
不使用ajax而是提交表单帖子并将我的JSON数据嵌入到表单值中.可能需要搞乱隐藏的iframe等.
不使用ajax而是将我的JSON数据转换为查询字符串以构建标准GET请求并将window.location.href设置为此URL.可能需要在我的单击处理程序中使用event.preventDefault()以防止浏览器从应用程序URL更改. …
我有一个生成PDF的动作类.该contentType适当地设定.
public class MyAction extends ActionSupport
{
public String execute() {
...
...
File report = signedPdfExporter.generateReport(xyzData, props);
inputStream = new FileInputStream(report);
contentDisposition = "attachment=\"" + report.getName() + "\"";
contentType = "application/pdf";
return SUCCESS;
}
}
Run Code Online (Sandbox Code Playgroud)
我action 通过Ajax调用来调用它.我不知道将此流传递给浏览器的方法.我尝试过一些东西,但没有任何效果.
$.ajax({
type: "POST",
url: url,
data: wireIdList,
cache: false,
success: function(response)
{
alert('got response');
window.open(response);
},
error: function (XMLHttpRequest, textStatus, errorThrown)
{
alert('Error occurred while opening fax template'
+ getAjaxErrorString(textStatus, errorThrown));
}
});
Run Code Online (Sandbox Code Playgroud)
以上给出了错误:
您的浏览器发送了此服务器无法理解的请求.
我想点击按钮时发送"ajax下载请求",所以我试着这样做:
JavaScript的:
var xhr = new XMLHttpRequest();
xhr.open("GET", "download.php");
xhr.send();
Run Code Online (Sandbox Code Playgroud)
的download.php:
<?
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename= file.txt");
header("Content-Transfer-Encoding: binary");
readfile("file.txt");
?>
Run Code Online (Sandbox Code Playgroud)
但是没有按预期工作,我该怎么办?先感谢您
我在MVC中有一个大(ish)形式.
我需要能够生成包含该表单子集中的数据的excel文件.
棘手的一点是,这不应该影响表单的其余部分,所以我想通过AJAX来做.我在SO上遇到了几个似乎有关的问题,但我无法弄清楚答案的意思.
这个似乎最接近我所追求的:asp-net-mvc-downloads-excel - 但我不确定我理解这个反应,现在已经有几年了.我还看到了另一篇关于使用iframe处理文件下载的文章(找不到了),但我不知道如何使用MVC.
我的excel文件返回正常,如果我正在做一个完整的帖子回来但我不能让它在mvc中使用AJAX.
我最近问了另一个(相关的)问题,这导致了这个后续问题: 提交数据而不是输入表单的文件
通过jQuery.ajax()文档(http://api.jquery.com/jQuery.ajax/)阅读,似乎接受的dataTypes列表不包含图像.
我正在尝试使用jQuery.get(或jQuery.ajax,如果必须)检索图像,将此图像存储在Blob中并将其上传到POST请求中的另一台服务器.目前,看起来由于数据类型不匹配,我的图像最终被破坏(大小以字节不匹配等).
执行此操作的代码如下(它在coffeescript中但不应该难以解析):
handler = (data,status) ->
fd = new FormData
fd.append("file", new Blob([data], { "type" : "image/png" }))
jQuery.ajax {
url: target_url,
data: fd,
processData: false,
contentType: "multipart/form-data",
type: "POST",
complete: (xhr,status) ->
console.log xhr.status
console.log xhr.statusCode
console.log xhr.responseText
}
jQuery.get(image_source_url, null, handler)
Run Code Online (Sandbox Code Playgroud)
如何将此图像检索为blob?
在我们的应用程序中,我们需要实现以下场景
我们的应用程序是基于ajax的应用程序,因此我们发送ajax请求(如使用jquery.ajax()函数)非常简单方便.
但是在googilng之后,事实证明只有在使用非ajax POST请求时才能进行文件下载(就像在这个流行的SO线程中所描述的那样).因此,我们需要实现更加丑陋且更复杂的解决方案,这需要form使用嵌套的隐藏字段构建HTML结构.
有人可以用简单的话来解释为什么ajax请求不能用于下载文件?这背后的机制是什么?
我下载文件作为ajax的响应.如何从内容处理中获取文件名和文件类型,并为其显示缩略图.我有很多搜索结果,但找不到正确的方法.
$(".download_btn").click(function () {
var uiid = $(this).data("id2");
$.ajax({
url: "http://localhost:8080/prj/" + data + "/" + uiid + "/getfile",
type: "GET",
error: function (jqXHR, textStatus, errorThrown) {
console.log(textStatus, errorThrown);
},
success: function (response, status, xhr)
{
var header = xhr.getResponseHeader('Content-Disposition');
console.log(header);
}
});
Run Code Online (Sandbox Code Playgroud)
控制台输出:inline; filename=demo3.png
我有一个要求:我正在制作一个AJAX请求将一些数据传递给服务器.在我的服务器中,我正在使用该数据创建一个文件.
"现在问题是文件没有下载到客户端".
(我使用Apache POI API从给定数据创建excel文件).任何人都可以帮我这么做吗?
这是我的代码:
(制作AJAX请求的代码)
<script>
function downloadUploadedBacklogs () {
try {
var table_data = [];
var count = jQuery("#backlogTable tr:first td" ).length;
jQuery("#<portlet:namespace/>noOfColumns").val(count);
var index = 0;
jQuery('tr').each(function(){
var row_data = '';
jQuery('td', this).each(function(){
row_data += jQuery(this).text() + '=';
});
table_data.push(row_data+";");
});
jQuery("#<portlet:namespace/>backlogDataForDownload").val(table_data);
jQuery("#<portlet:namespace/>cmd").val("downloadUploadedBacklogs");
alert('cmd: ' + jQuery("#<portlet:namespace/>cmd").val());
var formData = jQuery('#<portlet:namespace/>backlogImportForm').serialize();
jQuery.ajax({
url:'<%=resourceURL%>',
data:formData,
type: "post",
success: function(data) {
}
});
alert('form submitted');
} catch(e) {
alert('eroor: ' + e);
}
};
</script>
Run Code Online (Sandbox Code Playgroud)
Java代码serveResource( - , …
我正在尝试使用AJAX调用下载文件.我需要使用AJAX调用,因为我必须发出一个帖子请求以及我需要从客户端发送一些标题.由于Server API不在我们的控制之下,除了使用AJAX之外,我们没有太多选择.为了显示文件保存对话框,我将字节数组转换为blob到Object URL,如下所示
var oReq = new XMLHttpRequest();
oReq.open("POST","api/operations/zip", true);
oReq.responseType = "arraybuffer";
oReq.onload = function(oEvent) {
var blob=new Blob([oReq.response], {type: 'application/octet-binary'});
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="myFileName.zip"; link.click();
}
oReq.send(filePaths);
Run Code Online (Sandbox Code Playgroud)
现在我想知道除了浏览器内存限制之外,我们可以在JavaScript中使用Blob大小限制.如果我有大约8 GB RAM,可以下载4 GB文件.