我有一个javascript应用程序,它将ajax POST请求发送到某个URL.响应可能是JSON字符串,也可能是文件(作为附件).我可以在我的ajax调用中轻松检测Content-Type和Content-Disposition,但是一旦我检测到响应包含文件,我该如何让客户端下载它?我在这里读过很多类似的帖子,但没有一个提供我正在寻找的答案.
请,请不要发布答案,建议我不应该使用ajax或者我应该重定向浏览器,因为这都不是一个选项.使用纯HTML表单也不是一种选择.我需要的是向客户端显示下载对话框.可以这样做,怎么做?
编辑:
显然,这不可能做到,但有一个简单的解决方法,如接受的答案所示.对于今后遇到这个问题的人来说,我的解决方法如下:
__PRE__
所以基本上,只需生成一个HTML表单,其中包含与AJAX请求中使用的相同的参数并提交它.
我在这里指定了非常相似的要求.
我需要让用户的浏览器手动开始下载 $('a#someID').click();
但我无法使用该window.href
方法,因为它将当前页面内容替换为您尝试下载的文件.
相反,我想在新窗口/选项卡中打开下载.这怎么可能?
如何在用户单击链接时提示下载.
例如,而不是:
<a href="uploads/file.doc">Download Here</a>
Run Code Online (Sandbox Code Playgroud)
我可以用:
<a href="#">Download Here</a>
$('a').click... //Some jquery to download the file
Run Code Online (Sandbox Code Playgroud)
这样,Google就不会将我的HREF和私人文件编入索引.
这可以用jQuery完成,如果是这样,怎么样?或者应该用PHP或其他东西来完成?
我正在玩一个完全基于javascript的zip/unzip实用程序的想法,任何人都可以从浏览器访问.他们可以直接将他们的zip拖到浏览器中,然后让他们下载所有文件.他们还可以通过拖动单个文件来创建新的zip文件.
我知道在服务器端做它会更好,但这个项目只是为了一点乐趣.
如果我利用各种可用方法,将文件拖入浏览器应该很容易.(gmail风格)
编码/解码应该没问题.我见过一些as3 zip库,所以我相信我应该没问题.
我的问题是最后下载文件..
window.location = 'data:jpg/image;base64,/9j/4AAQSkZJR....'
Run Code Online (Sandbox Code Playgroud)
这在firefox中运行良好,但在chrome中不行.
我可以将文件嵌入到chrome中使用的图像<img src="data:jpg/image;ba.." />
,但文件不一定是图像.它们可以是任何格式.
任何人都可以想到另一种解决方案或某种解决方法吗?
我正在使用AngularJS和Spring编写应用程序.我想向服务器发送请求并下载从控制器返回的响应作为文件.在控制器中,我有csv文件的内容(作为字符串),即1;2;3;4
(1行,4列).将此响应作为文件下载的最简单方法是什么?
下面,我发布了我的简化代码.在Spring控制器中:
@RequestMapping(value = "/csv", method = GET)
@ResponseBody
public String getCsvFile() {
return getCsvContent();
}
Run Code Online (Sandbox Code Playgroud)
在javascript(AngularJS)
return $http({method: 'GET', url: 'csv/'});
Run Code Online (Sandbox Code Playgroud)
我也试图写入响应流(下面),设置标题,但在客户端我总是把这个内容作为字符串 - 而不是作为要下载的文件.
@RequestMapping(value = "/csv", method = GET)
@ResponseBody
public void getCsvFile(HttpServletResponse response) {
response.setContentType("application/csv");
response.setHeader("Content-Disposition", "attachment; filename=file.csv");
response.setContentLength(getCsvContent().getBytes().length);
ServletOutputStream out = response.getOutputStream();
out.write(getCsvContent());
out.flush();
out.close();
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道如何正确编写控制器的方法,以便在客户端下载响应作为文件?
是否可以使用HTTP POST下载文件?我知道"获取"方式(windows.location),但在我的情况下,有很多param应该传递给服务器
我有一个网站,提示用户从外部资源下载文件.由于外部文件名被散列并且用户下载了多个文件,因此用户很难知道他们下载的文件到达了他们请求的资源.例如,文件名fdae442dafe42.zip
可以是production-resources.zip
.
我正在寻找方法,以便浏览器将文件作为一个不同的名称下载.以下是我的一些想法以及为什么它们不起作用,但您可以找到解决方法.
请注意,我对外部资源没有任何控制权.我将无法更改标题或其他任何内容.我的服务是一个主要针对桌面用户的网站.Android和iOS解决方案不会那么有用.
下载属性
这种方法在谷歌Chrome和Firefox中运行了一段时间,但随后他们开始遵循W3 HTML5规范.外部资源需要发送Content-Disposition
之前谷歌浏览器和Firefox未检查过的标题.
PHP代理下载
我知道我可以让PHP脚本向外部资源发出请求,然后在更改标题和名称以满足我的需求时将其提供给最终用户.问题是网站流量很大,每个用户下载大约1-2GB的数据.我的服务器无法处理这种类型的流量,升级服务器的成本可能太高.
使用外部应用程序重命名文件
我正在考虑使用外部应用程序(可能是Chrome/Firefox扩展程序),它们会在完成下载后重命名这些文件.但考虑到我的观众数量足够大,一次访问者,要求他们下载应用程序或扩展程序是不太可能的.
Flash或Java嵌入式解决方案
我正在考虑使用Java或Flash嵌入式文件来处理文件下载,但我对这两个平台都不太了解.据我所知,Flash对用户的文件系统没有太多控制权,因此这可能是一个问题.Java将能够完成这项任务,但我真的希望我不必使用Java,因为它通常不安全,需要大量下载才能安装它(与外部软件的想法相同).
如果您对我可能采取的措施有什么想法来解决这个问题,我们将不胜感激.我不是在寻找任何代码,只是关于如何完成上述任务的想法.我想感谢你们所有的时间和专业知识.
我正在向服务器提交JSON数据.服务器生成PDF文件并使用该PDF文件的URL进行响应.然后我再向服务器发出下载PDF文件的请求.要进行下载,我创建一个隐藏的iframe并将源设置为PDF网址.请注意,我希望用户的浏览器保持在同一页面并在后台下载.关于我正在做什么以及我采用的解决方案的更多细节可以在这个SO问题中找到.
每当我在Chrome中使用这种技术时,一切正常.但是看一下chrome开发者控制台,我看到了错误信息Failed to load resource
.有没有办法以不同的方式做到这一点,以便我不会得到这些错误?
在jsfiddle上可以看到一个非常简单且有效的问题.只需单击"下载PDF"按钮,然后查看Chrome控制台即可.
该页面上的代码如下所示:
$(document).ready( function() {
var downloadFile = function(url){
var iframe = $("iframe#download");
if (!iframe.length) {
iframe = $("<iframe id='download' style='display:none;'/>");
$("body").append(iframe);
}
iframe.attr("src", url);
};
$("button").click(function() {
downloadFile("http://www.education.gov.yk.ca/pdf/pdf-test.pdf");
});
});
Run Code Online (Sandbox Code Playgroud) 我有一个大表单,允许用户输入许多不同的字段,当它们完成后,我需要将表单的内容发送到服务器,处理它,然后吐出一个包含该文件的.txt文件.他们下载的处理结果.现在,除了下载部分,我都已经完成了设置.在对jQuery .post()的响应上设置标题似乎不起作用.有没有其他方法比做某种iframe技巧使这项工作(一个JavaScript/jQuery下载文件通过POST与JSON数据)?
我再次将数据发送到服务器,处理它,然后想用标题回显结果以提示下载对话框.我不想将结果写入磁盘,提供下载,然后从服务器中删除该文件.
我的 Pdf 文件存储在 google 存储桶中,我有一个链接,比如https://storage.googleapis.com/bucketName/xyz.pdf。要下载这个文件,我正在这样做,
<a href="https://storage.googleapis.com/bucketName/xyz.pdf" download> Download This File </a>
Run Code Online (Sandbox Code Playgroud)
但是当我点击这个锚标签时,浏览器没有下载这个文件,而是在同一个选项卡中打开这个文件,即使我尝试通过 javascript 下载文件并使用这个代码。
var link = document.createElement("a");
link.download = 'File.pdf';
link.href = 'https://storage.googleapis.com/bucketName/xyz.pdf';
link.click();
Run Code Online (Sandbox Code Playgroud)
但同样的情况再次发生在同一个选项卡中打开文件而不是下载。我不知道主要问题是什么?这个 Google 存储桶是不允许文件下载,还是我的 chrome 设置阻止文件下载。它不是在 Chrome 中下载,我猜 Chrome 确实允许从 CORS 文件下载。
我有一个带有IHttpHandler的ashx文件.当我将一些数据发布到此IHttpHandler时,我会做一些工作,创建一个文件,然后将该文件返回给用户,以便他们可以通过浏览器保存文件.
创建文件后,我将尝试将文件写回响应:
HttpResponse response = context.Response;
response.ClearContent();
response.Clear();
response.ContentType = "application/octet-stream";
response.AddHeader("Content-Disposition", "attachment; filename=MYFILE.EXT");
response.WriteFile("C:\tempstuff\MYFILE.EXT");
Run Code Online (Sandbox Code Playgroud)
在稍后的块中,我将打电话给:
response.End()
Run Code Online (Sandbox Code Playgroud)
当我打电话给这个Handler时,没有任何反应.返回响应200,不抛出任何错误 - 但浏览器不会提示用户保存此文件.
以下是Fiddler捕获的响应:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Thu, 23 Aug 2012 12:12:19 GMT
X-AspNet-Version: 4.0.30319
Content-Disposition: attachment; filename=MYFILE.EXT
Cache-Control: private
Content-Type: application/octet-stream
Content-Length: 781053
Connection: Close
[raw content of the file here]
Run Code Online (Sandbox Code Playgroud)
这个回答对我来说是正确的.它包含文件的内容 - 但是在任何主流浏览器下,没有文件对话框提示我保存文件.
我在这做错了什么?
更新:如果它有帮助,这里是我从我的Web应用程序使用JavaScript调用此HttpHandler的地方.
$.ajax({
type: 'POST',
url: ashxUrl,
data: postData,
success: function (result) {
// Doin' stuff on success
},
error: function (error) …
Run Code Online (Sandbox Code Playgroud) 我有一个WebAPI控制器,需要根据请求下载一些文件,但是当涉及到纯文本文件时,它不会给我浏览器的下载请求.它只给出了纯文本响应,就像它是JSON(在我的例子中,它是一个JSONP WebAPI).
我已经从堆栈(和其他网站)检查了其他问答,但我仍然一无所获:
这是我当前的代码:
var httpResponse = new HttpResponseMessage(HttpStatusCode.OK);
httpResponse.Content = new StreamContent(new MemoryStream(Encoding.UTF8.GetBytes(content)));
httpResponse.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
httpResponse.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
httpResponse.Content.Headers.ContentDisposition.FileName = "speedcam.txt";
return httpResponse;
Run Code Online (Sandbox Code Playgroud)
这是Chrome的回应:
缓存控制:无缓存
内容处置:附件; 文件名= speedcam.txt
内容长度:17462
内容类型:应用/八位字节流
日期:星期一,2012年8月27日04:53:23 GMT
到期日:-1
附注:无缓存
服务器:Microsoft-IIS/8.0
X-ASPNET-版本:4.0.30319
X-已启动方式:ASP.NET
X-SourceFiles:= UTF-8乙TTpcVHJhYmFsaG9cTWFwYVJhZGFyXE1hcGFSYWRhci5XZWJBUEk0XEV4cG9ydGE =????
似乎没问题,但整个文件文本都在Chrome开发工具"响应选项卡"中.
我正在尝试对发送JSON数据的服务器进行POST调用.服务器获取JSON数据,进行一些处理,然后发回Excel .xlsx作为响应.我希望浏览器打开"将文件另存为"对话框以供用户保存.我一直在寻找一个干净的解决方案来做到这一点.但是这个问题的一个可能的解决方案JavaScript/jQuery通过POST下载文件和JSON数据建议将Excel文件保存在服务器上,然后发回一个URL链接,然后打开一个iframe供用户下载.这对我来说是不行的,因为用户可以在服务器上创建数千个Excel文件,并且服务器具有有限的节省空间.我希望解决方案能够即时实现.我见过的另一个解决方案建议将数据转换为表单,然后使用表单提交.再次这是一个禁忌,因为我的数据在数百甚至数千个Excel行的范围内.
我的jQuery POST调用:
$.ajax({ type: 'POST', url: '/server/path', data: JSON.stringify(dataSent), processData: false, success: function(data, textStatus, jqXHR) { }, error: function(result, status, err) { }, contentType: 'application/json', dataType: 'application/vnd.ms-excel' });
在后端我设置了这个:
Response.header("Content-Type","application/vnd.ms-excel")
Response.header("Content-Disposition","attachment; filename = \"export.xlsx \"")
强制浏览器打开"将文件另存为..."对话框的最佳方法是什么?
谢谢,