[已解决问题] 载WEB目录外的文件解决方法
提问时间: 2008-02-19 17:43
悬赏分:50 浏览:398 次
在WEB上做文件管理,文件存放在WEB外地其它目录,要下载前先需要登录验证权限,有权限才可以下载。我想到的方法有多种:
1   要读取文件时临时复制到WEB目录下。缺点:占用太多系统资源,造成很大磁盘碎片。
2   用流读取,缺点:占用资源。
3   临时建立快捷方式。要删除快捷方式时,如果别人也在使用,就会出错,如果不删除就会出现安全隐患。
4   用ISAPI,做IIS扩展,当访问时就建立映射,把文件映射到WEB目录。在网上看到别人能实现,我不知道怎么做。
提问者:kony - 初学一级
最佳答案
Response.TransmitFile(),就很好用的.

Response.ContentType = "application/x-zip-compressed";
        Response.AddHeader("Content-Disposition", "attachment;filename=downloadfilename.jpg");
        Response.TransmitFile("Source/Users/" + Session["UserName"].ToString() + "/images/temp0.jpg");
2008/2/19 19:05:09 回答者:侯垒
其它回答(3)
试过HttpResponse.TransmitFile()没?
2个月前   回答者:deerchao - 老鸟四级
把文件所在地址映射成一个站点下的虚拟目录试试. 

或者另建一个二级域名的网站如 files.yourdomain.com , 指向文件所在目录. 这样就可以实现分开布署了. 验证也可以做到.
2个月前   回答者:沙加 - 老鸟四级
文件下载不要直接指向文件本身 
private void DownBackup(string fileName, string zipPath)
        {
            string path = Server.MapPath(zipPath);
            FileInfo file = new System.IO.FileInfo(@path);           

            Response.Clear();
            
            Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName) + ".zip");
            Response.AppendHeader("Content-Length", file.Length.ToString());
            Response.Charset = "gb2312";



            string fileExtension = file.Extension;



            // 根据文件后缀指定文件的Mime类型

            switch (fileExtension)
            {

                case ".mp3":

                    Response.ContentType = "audio/mpeg3";

                    break;

                case "mpeg":

                    Response.ContentType = "video/mpeg";

                    break;

                case "jpg":

                    Response.ContentType = "image/jpeg";

                    break;

                case "........等等":

                    Response.ContentType = "....";

                    break;

                default:

                    Response.ContentType = "application/octet-stream";

                    break;

            }
         

            Response.TransmitFile(file.FullName);           

            Response.End();            

            Response.Write("<script>window.close();</script>");


        }
2个月前   回答者:李.net - 菜鸟二级
评论
2个月前   kony :
HttpResponse.TransmitFile()
没试过,看了MSDN的介绍,是采用流动形式输出。

建虚拟目录没试过,这种方式与创建快捷方式差不多。
采用二级域名也是避免不了URL暴露的问题。

还有没有其它方法?

2个月前   deerchao :
我就晕了,你就算暴露URL,直接让IIS去响应,它还不得从硬盘读文件,然后发送内容,做TransmitFile完全相同的工作?
TransmitFile本身已经针对各种情况下的性能做了优化.
2个月前   kony :
我不懂TransmitFile怎么实现,是否一次性把整个文件加载到内存,然后IIS再提交提交给客户端。
如果客户直接下载文件,应该是不把文件一次性加载到内存中。
这是我的理解,不知道是否正确。
2个月前   deerchao :
看具体情况了.
如果文件很小,内存又多,当然应该一次性加载整个文件,并且缓存一段时间.
如果文件很大(比如一个高清电影文件几十G),内存不够,肯定只能读一部分发送一部分.

TransmitFile的实现是不做缓存.
如果你的情况下确实需要缓存的话,也可以自己用FileStream读取内容,然后用HttpRuntime.Cache缓存,然后使用HttpResposne.OutputStream.Write(byte[],int, int)来传输数据.

2个月前   kony :
Response.Clear();
Response.ContentType = "application/x-zip-compressed";
Response.AddHeader("Content-Disposition", "attachment;filename=" + Path.GetFileName(FileName));
Response.TransmitFile(FileName);
Response.End();

结果下载后打开文件失败,提示****.css无法打开,奇怪!
2个月前   deerchao :
Response.ContentType = "application/x-zip-compressed";
你确定下载的文件是zip文件吗?
如果是其它格式的文件,可以到这里看看它的MIME类型是什么:
http://www.w3schools.com/media/media_mimeref.asp .
   您需要登录以后才能回答!
我的问题    我要提问


快到期问题

> 问题排行榜

有不合适内容,建议去除