有没有办法在客户端创建文本文件并提示用户下载它,而不与服务器进行任何交互?我知道我不能直接写入他们的机器(安全性和所有),但是我可以创建并提示他们保存它吗?
我有一个基于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更改. …
如何在用户单击链接时提示下载.
例如,而不是:
<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或其他东西来完成?
基于在新浏览器完整窗口中打开PDF的问题,看起来我可以使用JavaScript打开一个带有PDF文件的新窗口,其中包含以下代码:
window.open('MyPDF.pdf', '_blank');
Run Code Online (Sandbox Code Playgroud)
我想通过添加一个字节数组而不是文件名来从服务器返回,作为URL位置使用 window.open
目前,我正在恢复的PDF文件就像这样:
Response.Clear();
Response.ContentType = "application/pdf";
Response.BinaryWrite(pdfByteArray);
Response.Flush();
Run Code Online (Sandbox Code Playgroud)
有没有办法在javascript中打开一个带有PDF字节数组的新窗口.
像这样的东西:
var script = "window.open('" + pdfByteArray + "', '_blank');";
ScriptManager.RegisterClientScriptBlock(Parent.Page, typeof(Page), "pdf", script, true);
Run Code Online (Sandbox Code Playgroud) 我知道,出于安全原因,Javascript无法在文件系统中写入数据.我经常读到,用Javascript本地保存数据的唯一方法是使用cookies或localStorage.
但它是可能的,在非常特殊的情况下,当文件被访问本地(通过互联网而不是),将数据写入本地?(没有任何服务器语言,甚至根本没有任何服务器......只是本地浏览HTML文件)
... HTML文件被新内容覆盖了吗?(即按下SAVE时应更新本地 HTML文件).

感谢Javascript,当本地访问HTML页面时,这可以保存文件吗?
注意:我希望能够以静默方式保存,而不是建议下载/保存对话框,用户必须在其中选择下载位置,然后"确定要覆盖"等.
编辑:为什么这个问题?我希望能够做一个HTML/JS记事本,我可以在没有任何服务器的情况下在本地运行(没有apache,没有php).我需要能够轻松保存,而无需处理对话框"你想在哪里下载文件?".
我的问题类似于使用Ajax下载和打开pdf文件
但不完全相同,我想要一个JQuery ajax的原因是我的文件是从将从同一页面获取的数据动态生成的.
所以基本上我有一个需要发送到服务器的Json对象,它会动态生成一个文件并将其发送回浏览器.
我不想在我的Json对象stringyfied的锚点上使用查询字符串,因为我认为这将是一个潜在的威胁,因为查询字符串有字符限制(我在这里吗?).
请告诉我如果我的工作流程正确或我可以使用不同的流程实现同样的事情.
我想使用jQuery Ajax web方法下载文件,但它不起作用.
这是我对web方法的jQuery ajax调用:
function GenerateExcel() {
var ResultTable = jQuery('<div/>').append(jQuery('<table/>').append($('.hDivBox').find('thead').clone()).append($('.bDiv').find('tbody').clone()));
var list = [$(ResultTable).html()];
var jsonText = JSON.stringify({ list: list });
$.ajax({
type: "POST",
url: "GenerateMatrix.aspx/GenerateExcel",
data: jsonText,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
},
failure: function (response) {
alert(response.d);
}
});
}
Run Code Online (Sandbox Code Playgroud)
这是Web方法定义:
[System.Web.Services.WebMethod()]
public static string GenerateExcel(List<string> list)
{
HttpContext.Current.Response.AppendHeader("content-disposition", "attachment;filename=FileEName.xls");
HttpContext.Current.Response.Charset = "";
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.Write(list[0]);
HttpContext.Current.Response.End();
return "";
}
Run Code Online (Sandbox Code Playgroud)
如何完成它?请帮帮我.
还有一件事:我想在客户端PC上下载它,而不是将其保存在服务器上.
我的asp.net-mvc项目中有以下javascript代码和控制器操作:
使用Javascript:
$("#exportPPT").live('click', function (e) {
window.location.href = "/Initiative/GenerateFile" + GenerateParams();
});
Run Code Online (Sandbox Code Playgroud)
C#控制器:
public ActionResult GenerateFile(MyParams myParams)
{
var template = Server.MapPath(PPT_ROOT + "/template.pptx");
IEnumerable<Order> orders = Model.GetOrders(myparams);
var pptResults = GeneratePowerpointFile(orders);
return File(pptResults.Content, "application/vnd.ms-powerpoint", pptResults.FileName);
}
Run Code Online (Sandbox Code Playgroud)
但是在某些情况下,让我们说当orders.Count()为0然后而不是生成文件时,我宁愿向用户回复一条错误信息,说明你有错误.
鉴于上述代码,实现此目的的最佳方法是什么?我想把它改成ajax调用,但我不知道如何在json请求中下载我的Fie()和包(如果支持的话).
有什么建议?
我是Firefox插件开发的新手,到目前为止一直很顺利,但我仍然坚持如何从Web上下载一个文件,给定一个URI,并将其保存到磁盘.Mozilla的MDN文档包含有关如何上传文件的信息,但下载文件部分是空的,尚未编写.遗憾的是,我还没有找到任何描述如何执行此操作的文档.
有谁知道如何做到这一点的相关文件?
旧的Facebook Photo Album Downloader addon在其覆盖JavaScript中使用此函数调用:
saveURL(images[i].replace(/\/s/g, "/n"), null, null, false, true, null);
Run Code Online (Sandbox Code Playgroud)
显然,第一个参数是要请求的URI.该saveURL函数未在任何地方定义,因此我假设它是一个扩展API函数.我在我的新插件中试过它,它确实有用.但是,我想知道其他论点的含义.
javascript ×5
jquery ×5
asp.net ×2
file ×2
.net ×1
ajax ×1
asp.net-mvc ×1
c# ×1
client-side ×1
download ×1
fileresult ×1
firefox ×1
html ×1
pdf ×1
powerpoint ×1
rest ×1
wcf ×1
webmethod ×1
window.open ×1