1:单击下载链接,却不出现另存为对话框。
单击文件链接,下载文件,如果您单击这些链接,就会发现浏览器对每个文件类型的处理方式都不同,具体取决于注册了哪些助手应用程序来打开每个文件类型。默认情况下,如果您单击 .asp 页面、.html 页面、.jpg、.gif 或 .txt,它会在浏览器其本身中打开,并且不出现“另存为”对话框。这是因为这些文件的扩展名都属于已知的 MIME 类型。如果你不想在打开这些文件,那你需要修改MIME 类型的默认行为。
添加"Content-Disposition"响应头,无论文件是否为 MIME 类型,都会出现“保存”对话框。
if (downFile.Exists)
{
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + downFile.Name);
Response.AddHeader("Content-Length", downFile.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(downFile.FullName);
Response.End();
}
2:文件太大,下载中断,出错。
如果你对Response.WriteFile 的单一调用,这方法下载小文件到没什么问题,但是对于大文件就有问题了。因为必须先将文件加载到服务器内存中才能将其下载到客户端。如在配置低的服务器上,此问题更严重。如果同时下载的用户多的话,那更不用说了。处理大文件的最有效方法是将文件分成若干文件块,每块大小可以根据服务器的性能和限制来分配。
if (downFile.Exists)
{
const int perSize = 10000;
byte[] buffer = new byte[perSize];
Response.Clear();
using (FileStream fileStream = downFile.OpenRead())
{
long dataLength = fileStream.Length;
Response.AddHeader("Content-Disposition", "attachment; filename=" + downFile.Name);
Response.AddHeader("Content-Length", downFile.Length.ToString());
Response.ContentType = "application/octet-stream";
while (dataLength > 0 && Response.IsClientConnected)
{
int lengthRead = fileStream.Read(buffer, 0, perSize);
Response.OutputStream.Write(buffer, 0, lengthRead);
Response.Flush();
dataLength -= lengthRead;
}
}
Response.Close();
}
IIS不支持下载2G以上的文件,则需要利用FTP,第三方控件,BITS等来下载此类大文件。
3:Response.TransmitFile
在.NET2.0里面提供了此方法,此方法解决了在服务器内存缓存文件的问题。TransmitFile 的用法与 WriteFile 非常相似。你可设置Response.ContentType属性,来限制MIME类型,增加一些安全性和容错性。
4:加入下載失敗了
当下载一个大文件失败了,要从头下载,那不是要气死人吗。如何恢复失败的下载呢?在前面分块下载文件里,每循坏一次下载10000字节的数据,在循环里面,Response.IsClientConnected 判断用户是否还连接状态中,加入用户断开连接,服务器将停止传输数据,并记录剩余的字节数。如果用户试图完成失败的下载,可将已经下载的部分数据保存。HTTP的Accept-Ranges 和 Etag标头可以帮助我们实现该功能。Accept-Ranges指明该进程支持恢复下载,Etag为该会话指明唯一的标识。如果服务器发送一个可恢复下载的HTTP头可能是这样的:
Connection: close
Date: Mon, 9 Oct 2008 17:09:13 GMT
Accept-Ranges: bytes
Last-Modified: Mon, 9 Oct 2008 16:05:13 GMT
ETag: "43a5db8ntf23c82:3656"
Cache-Control: private
Content-Type: application/octet-stream
Content-Length: 4251455
Accept-Ranges 和 Etag的存在,所以瀏覽器知道可恢復下載 。
如果下载失败,再次请求该文件时,浏览器会发送Etag头,文件名和指明在中断前已成功下载的文件字节数的值范围。
Range: bytes=231242-
Unless-Modified-Since: Sun, 12 May 2007 17:43:35 GMT
If-Range: "43a5db8ntf23c82:3656"
If-Range 元素包含服务器可用于标识要重新发送的文件的原始 ETag 值。您还会看到 Unless-Modified-Since 元素包含了最初下载的开始日期和时间。服务器将利用此信息来确定自最初下载开始后该文件是否已被修改过。如果已被修改,则服务器将从头开始重新下载。
Range 元素也包含在标头中,它会向服务器指明还需要传送多少字节才能完成文件,服务器可以利用此信息来确定应从已部分下载文件的何处开始继续下载。
浙公网安备 33010602011771号