我正在尝试做同样的事情,例如在sourceforge上。用户创建一些数据后,我生成一个文件,我希望在页面加载后提供给他。但是,我对javascript和
的简单复制粘贴几乎一无所知< script type="text/javascript">
var download_url = "http://downloads.sourceforge.net/sourceforge/itextsharp/itextsharp-4.1.2-dll.zip?use_mirror=dfn";
function downloadURL() {
if (download_url.length != 0 && !jQuery.browser.msie){
window.location.href = download_url;
}
}
jQuery(window).load(downloadURL);
< /script>
还不够。用户下载文件很重要,那么怎么做呢?
与之前相关的问题是 - 在哪里存储我创建的文件?有一次使用asp.net开发服务器然后在真正的iis服务器上?这个地址应该怎么样?我试过的时候
setTimeout("window.location.href='file://localhost/C:/Downloads/file.pdf'", 2000);
我什么都没得到,http是一个未知地址的错误。
答案 0 :(得分:1)
您要求用户的浏览器在自己的计算机上查找文件...您正试图将其保存在那里。
你可以使用类似的东西:
window.location.href='http://www.yourServer.com/generatePDF.asp?whatever=whatever'
其中http://www.yourServer.com/generatePDF.asp?whatever=whatever是为用户生成pdf文件的内容
答案 1 :(得分:1)
在服务器上,您必须按照these answers中的说明将响应标题中的内容处置设置为“附件”。
如果这样做,下载不会影响当前在浏览器中显示的页面。因此,如果您在Javascript中发起获取附件的请求,则浏览器将单独保留该页面,并且用户将看到一个带有打开/保存/取消问题的消息框。
答案 2 :(得分:1)
请参阅Haack's DownloadResult示例。它解释了(我认为)你正在尝试做的事情。除非您使用下载操作网址提供超时调用。
答案 3 :(得分:1)
您可以创建自己的PdfResult,它会像这样扩展ActionResult:
public class PdfResult : ActionResult
{
public byte[] Content { get; set; }
public string FileName { get; set; }
public override void ExecuteResult(ControllerContext context)
{
var response = context.HttpContext.Response;
response.AddHeader("content-disposition", "attachment; filename=" + this.FileName);
response.AddHeader("content-length", this.Content.Length.ToString());
response.ContentType = "application/pdf";
using (MemoryStream memoryStream = new MemoryStream(this.Content))
{
memoryStream.WriteTo(response.OutputStream);
}
response.End();
}
然后在您的操作中,您只需按如下方式返回文件:
public ActionResult Pdf(string param1...)
{
var content = GeneratePdf(); //etc
var fileName = AssignFileName();
return new PdfResult { Content = content, FileName = fileName + ".pdf" };
}
答案 4 :(得分:0)
有几件不同的事情。首先,由于您正在使用MVC,因此请创建一个实际生成文件的操作并将其作为FileResult返回。该文件可以是服务器上的实际文件,但也可以动态生成 - 比如在MemoryStream中 - 以及从中创建的FileResult。如果内容不是将通过插件在浏览器中呈现的内容,则将内容设置为application / octet-stream或实际文件类型。其次,不要在呈现页面的操作中生成文件,而是使用您引用的技术调用从该页面生成FileResult的操作(尽管看起来他们正在为IE执行不同的操作)。如果MIME类型不是可以呈现的类型,则将下载它。
public ActionResult GenerateFile( string value, int other )
{
MemoryStream file = new MemoryStream();
...
return File( file, "application/octet-stream" );
}