在IIS7中强制下载文件

时间:2013-10-16 13:26:56

标签: iis download iis-7 content-disposition

使用IIS7,是否有办法强制客户端浏览器下载文件而不是尝试在浏览器中显示?在我的情况下,我想强制浏览器下载所有MP4视频文件。

2 个答案:

答案 0 :(得分:5)

我从this博客找到答案。

使用IIS7 Url Rewrite模块,您可以更改Content-Disposition标题,建议客户端浏览器下载而不是尝试显示该文件。

使用IIS管理器(以mp4为例)

  1. 确保您已启用IIS7的URL重写模块
  2. 打开IIS7管理器
  3. 导航到您要强制下载的网站(或子网站)
  4. 在功能视图中选择Url Rewrite
  5. 在右侧栏中选择“查看前置条件”
  6. 添加以下前提条件
    1. 名称:FileIsMP4
    2. 使用:正则表达式
    3. 逻辑分组:全部匹配
    4. 转移输入:{REQUEST_FILENAME}
    5. 检查输入字符串:是否匹配模式
    6. 模式:\.mp4$
  7. 返回URL Rewrite规则列表并添加以下出站规则
    1. 名称:强制下载MP4s
    2. 前提条件:FileIsMP4
    3. 匹配 - 匹配范围:服务器变量
    4. 匹配 - 变量名称:RESPONSE_Content-Disposition
    5. 匹配 - 变量值:匹配模式
    6. 匹配 - 使用:正则表达式
    7. 匹配 - 模式:。*
    8. 匹配 - 忽略大小写 - 是
    9. 条件 - 逻辑分组:全部匹配
    10. 条件 - 输入:{REQUEST_FILENAME}
    11. 条件 - 类型:匹配模式
    12. 条件 - 模式:(.*)\\([^/]+)\.mp4$
    13. 条件 - 跨越条件跟踪捕获组:是
    14. 操作 - 操作类型:重写
    15. 操作 - 操作属性 - Value: attachment; filename={C:2}.mp4
    16. 操作 - 替换现有服务器变量值:是
    17. 操作 - 停止处理后续规则:否
  8. 修改Web.Config

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.webServer>
            ...
            <rewrite>
                <outboundRules>
                    <rule name="Forcing Download for MP4s" preCondition="FileIsMP4">
                        <match serverVariable="RESPONSE_Content-Disposition" pattern=".*" />
                        <conditions>
                            <add input="{REQUEST_FILENAME}" pattern="(.*)\\([^/]+)\.mp4$" />
                        </conditions>
                        <action type="Rewrite" value="attachment; filename={C:2}.mp4" />
                    </rule>
                    <preConditions>
                        <preCondition name="FileIsMP4">
                            <add input="{REQUEST_FILENAME}" pattern="\.mp4$" />
                        </preCondition>
                    </preConditions>
                </outboundRules>
            </rewrite>
            ...
        </system.webServer>
    </configuration>
    

答案 1 :(得分:-1)

谢谢,这正是我所需要的。我稍微调整了一下,添加了通过附加查询字符串“?download = yes”来指定是否下载文件的功能。

<outboundRules>
  <rule name="Force download with query string" preCondition="DownloadableFileTypes">
    <match serverVariable="RESPONSE_Content-Disposition" pattern=".*" />
    <conditions>
      <add input="{REQUEST_FILENAME}" pattern="(.*)\\([^/]+)\.(.+)$" />
      <add input="{QUERY_STRING}" pattern="^.*download=yes.*$" />
    </conditions>
    <action type="Rewrite" value="attachment; filename={C:2}.{C:3}" />
  </rule>
  <preConditions>
    <preCondition name="DownloadableFileTypes" logicalGrouping="MatchAny">
      <add input="{REQUEST_FILENAME}" pattern="\.mp3$" />
      <add input="{REQUEST_FILENAME}" pattern="\.pdf$" />
      <add input="{REQUEST_FILENAME}" pattern="\.doc$" />
      <add input="{REQUEST_FILENAME}" pattern="\.docx$" />
      <add input="{REQUEST_FILENAME}" pattern="\.xls$" />
      <add input="{REQUEST_FILENAME}" pattern="\.xlsx$" />
      <add input="{REQUEST_FILENAME}" pattern="\.mp4$" />
    </preCondition>
  </preConditions>
</outboundRules>