如何在不离开页面的情况下提供文件?

时间:2009-03-03 01:49:45

标签: ajax web-applications file-io

宗旨

我试图让用户通过单击页面上的按钮来下载文件(在这种情况下是myfile.zip),没有他们离开页面 - 即浏览器必须保持当前状态页面,并将它们保留在可以继续使用该页面的位置,包括再次单击该按钮(如果他们希望获得该文件的新副本)。

我需要在所有浏览器(IE6-8,Firefox,Chrome,Opera,Safari)中使用它。

背景

在zip中打包是根据他们的其他交互(其中一些可能部分完成)从同一页面中选择的东西(这都是通过ajax完成的),我不希望他们离开页面他们会失去任何未保存的变化。

6 个答案:

答案 0 :(得分:12)

下载文件时添加以下标题:

Content-disposition: attachment; filename=filename.zip

大多数浏览器会在清除当前页面之前等待他们正在加载什么类型的东西,如果它应该作为文件下载,他们将无法离开当前页面(他们将显示在页面前面的“另存为”对话框,可以将其关闭以返回到页面。)

但是,如果您发现某个浏览器确实离开了当前页面,您可以尝试使用小iframe中包含的下载链接,这样只会更改该帧。

我认为这是在新窗口中打开链接的更好解决方案,因为一旦确定它是应该下载的文件,某些浏览器将保持新窗口,因此您最终得到一个空白窗口。

答案 1 :(得分:3)

如果您在新窗口/标签中打开链接(例如,通过<a>标记的target="_blank"属性),则不会干扰当前窗口的内容。

target属性为deprecated,但受到广泛支持。根据浏览器的不同,您也可以使用CSS3 target-name property

如果您的目标是绝对保证主窗口不受干扰,这可能是最安全的方法,因为它可以抵御下载错误。

答案 2 :(得分:3)

为了避免离开页面(如果你这样做,页面会首先尝试关闭它,这样你就可以确保你已经保存了所有内容,如果你没有,你会得到警告信息)或留下空白标签(我不喜欢,也不使用折旧的目标属性)我使用了iframe,其src属性在javascript中被更改。

除了某些版本的Opera之外,这种方法无处不在,我认为这是一种可接受的损失(我可能会通过使用其他解决方案之一加上浏览器检测来解决这个问题)。

答案 3 :(得分:0)

我相信如果您将用户定向到一个文件并且MIME类型是浏览器知道必须下载vs渲染的内容,浏览器将不会离开该页面。例如,如果您提供zip文件,浏览器会知道它是一个zip文件并提示下载。但是如果您要从页面请求(即/file.aspx?file=myinfo.zip)提供zip文件,那么file.aspx需要在发回响应之前将MIME类型更改为“application / zip”为了提示用户下载。

这里的一个主要警告是,如果文件由于某种原因不存在,用户将获得404并被定向到错误页面。

作为一种不重定向用户的可靠方式,您可以打开弹出窗口进行下载。

答案 4 :(得分:0)

我们通过将ContentType设置为“application / octet-stream”,然后使用Response.BinaryWrite(..)和Response.Flush()流式传输zip文件,在aspx页面上进行回发。

为用户弹出一个“是否要打开或保存”文件。

页面仍然可用。

答案 5 :(得分:0)

顺便说一下,单独指定适当的内容处置标头可能不适用于所有浏览器。具体来说,我发现它在Opera中不起作用,IE7显示黄色安全警告栏。

除了正确的标题之外,正如thomasrutter所描述的那样,我这样做的方法是使用隐藏的形式:

<form id="download_form" method="get" action=""></form>

当用户单击按钮时,您可以使用文件的URL操作表单的“action”属性。

这似乎适用于所有浏览器,甚至IE7!