在页面完成后加载文件而不重定向
我正在尝试做几乎相同的操作,例如在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服务器上?这个地址应该怎么看?当我尝试
我什么都没有,与http未知地址的错误。
您要求用户的浏览器在他们自己的计算机上查找文件...您试图保存在那里。
你可以使用类似:
window.location.href='http://www.yourServer.com/generatePDF.asp?whatever=whatever'
其中http://www.yourServer.com/generatePDF.asp?whatever=whatever是什么是生成的PDF文件的用户
在服务器上,你必须设置内容部署在响应头“附件“,如these answers中所述。
如果这样做,下载不会影响当前浏览器中显示的页面。因此,如果您使用Javascript发起获取附件的请求,则浏览器将仅保留该页面,并且用户将看到带有打开/保存/取消问题的消息框。
几个不同的事情。首先,由于您使用的是MVC,因此请创建一个实际生成该文件的操作并将其作为FileResult返回。该文件可以是服务器上的实际文件,但也可以动态生成 - 例如在MemoryStream中 - 以及由此创建的FileResult。如果内容不是通过插件在浏览器中呈现的内容,则将内容设置为application/octet-stream或实际文件类型。其次,不要在呈现页面的动作中生成文件,而是使用所引用的技术调用从该页面生成FileResult的动作(尽管它看起来像是在为IE做一些不同的事情)。如果MIME类型不是可以呈现的MIME类型,它将被下载。
public ActionResult GenerateFile(string value, int other)
{
MemoryStream file = new MemoryStream();
...
return File(file, "application/octet-stream");
}
您可以创建自己的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" };
}
的问题是,我使用的iText库来生成pdf。因此,要创建的文件属于Document类型,与FileResult不兼容。但是,如果有另一种方式来生成PDF ..? – Trimack 2009-06-03 14:06:52