通过IIS强制下载网络共享上的文件

时间:2009-10-05 09:04:50

标签: iis download virtual-directory network-share

我正在编写一个快速网页来控制对基于Web的音频文件存储库(讲座录音)的访问。音频文件保存在SAN上,并使用UNC共享从Web服务器访问。

我想强制出现一个“保存”对话框,因为在测试过程中我们发现某些网页浏览器很难保存mp3文件。重要的是我们的学生可以保存文件,而不是只是听它。

另一个要求是,只有在学生点击同意尊重文件版权的复选框后,才能使用下载链接。

我首先尝试在网站上使用经过身份验证的域用户虚拟目录。但是,如果我使用命令按钮打开音频文件的URL,Web浏览器可能会立即尝试播放它。

除此之外,我尝试使用ADODB.stream并使用stream.LoadFromFile将文件发送给具有适当内容处置的学生以强制下载。由于LoadFromFile使用文件路径,因此无法使用IIS虚拟目录,因此必须授予网站对我的网络共享的匿名登录访问权限。我通过将其作为域帐户运行来完成此操作,但这让我有点紧张,因为我认为它不太安全。

即便如此,我仍然无法达到预期目标,因为stream.LoadFromFile命令似乎拒绝从网络共享中读取文件。即使我用于运行站点的域登录具有对该网络共享的完全访问权限,它也会出现身份验证错误。

有关实现目标的替代方法的任何建议吗?

3 个答案:

答案 0 :(得分:2)

将文件返回浏览器时,将mime-type设置为“application / x-unknown” - 这将导致浏览器要求您下载,因为它不知道如何处理它。

浏览器有可能会读取文件扩展名并尝试变得聪明,但是你无能为力。

答案 1 :(得分:2)

您最好的选择是添加以下您的回复标题。

内容 - 处理:附件;文件名= fname.ext

请参阅:http://support.microsoft.com/kb/260519了解更多信息

答案 2 :(得分:0)

我喜欢ck改变mime类型的答案(如果我排名,我会投票)。这将导致无法解决问题。

您可以修改响应标头以更改mime类型而不是使用ADODB请尝试以下代码。

         Response.Clear()  
         Response.AddHeader("Content-Disposition", "attachment; filename=" & file.Name)  
         Response.AddHeader("Content-Length", file.Length.ToString())  
         Response.ContentType = "application/octet-stream"  
         Response.WriteFile(file.FullName)  
         Response.End 'if file does not exist  

您还可以尝试使用ZIP扩展程序压缩音频文件。这将具有相同的效果,并且还减少了下载所需的带宽。如果动态执行此操作,您可能需要考虑缓存压缩文件。

请尝试查看完整代码 - http://www.xefteri.com/articles/show.cfm?id=8

您也可以将版权归化添加到预下载检查中。