.NET Web服务 - 下载文件并强制浏览器打开它

时间:2013-08-29 14:57:22

标签: .net web-services asmx

我有一个Web方法,可以创建一个文件并将其提供给浏览器。

在Chrome中,文本文件只需下载。

在IE9中,浏览器会询问我是否要打开或保存文件。

我想要做的是浏览器自动打开文件(在该文件类型的默认程序中)

代码:

        [WebMethod]
        [ScriptMethod(UseHttpGet = true)]
        public void Test(string docNum, string docVersion)
        {
            var response = Context.Response;
            response.ContentType = "application/octet-stream";
            response.AppendHeader("Content-Disposition", "attachment; filename=" + docNum + ".txt");
            Byte[] stream = System.Text.Encoding.ASCII.GetBytes("docNum + "," + docVersion);
            response.OutputStream.Write(stream, 0, stream.Length);
            response.Flush();
        }

我通过以下方式宣布:

http://localhost:12345/Services/Foo.asmx/Test?docNum=123456789&docVersion=1

如何让浏览器只打开文件?

3 个答案:

答案 0 :(得分:2)

可能与浏览器配置为打开的文件类型更相关。

如果浏览器不知道如何打开某些类型的文件,它将提示您下载

另一件事是你已经为TXT文件指定了octect-stream

Content-Type: application/octet-stream
Content-Disposition: attachment;filename=\"My Text File.txt\"

这实际上迫使浏览器下载这里提到的内容

<强> What content type to force download of text response?

答案 1 :(得分:1)

如果您希望浏览器打开jpg或pdf或xls,则需要在&#34; ContentType&#34;中指定正确的mime类型。头。例如,现在您输出的所有内容为&#34; octet-stream&#34;,这是非常通用的。浏览器无法猜测哪个程序会打开这样的泛型类型。但是,如果它是xls,则可以使用&#34; application / vnd.ms-excel&#34;的ContentType。

这是一个SO答案,指出了用于查找可能的mime类型的大量资源:https://stackoverflow.com/a/7192429/283895

答案 2 :(得分:1)

如果客户端计算机知道如何打开文件扩展名,您实际上可以执行此操作。 我已经让它在 IE9

中工作了

假设您有一个文件扩展名.xyz

预录:客户端计算机应该已注册文件扩展名.xyz,以打开您希望它打开的每个程序。如何到达:http://windows.microsoft.com/en-us/windows-vista/change-which-programs-windows-uses-by-default

第1步:在IIS中设置一个新的MIME类型,其属性为文件名扩展名= .xyz,MIME类型=`application / xyz“如何到达此处:{{3 }}

第2步:在代码中将MIME类型设置为您刚创建的类型,并将Content-Disposition更改为“inline”:

response.ContentType = "application/xyz";
"Content-Disposition", "inline;

.xyz

的文件类型的工作示例
        [WebMethod]
        [ScriptMethod(UseHttpGet = true)]
        public void Test(string docNum, string docVersion)
        {
            var response = Context.Response;
            response.ContentType = "application/xyz";
            response.AppendHeader("Content-Disposition", "inline; filename=" + docNum + ".xyz");
            Byte[] stream = System.Text.Encoding.ASCII.GetBytes(docNum + "," + docVersion);
            response.OutputStream.Write(stream, 0, stream.Length);
            response.Flush();
        }

这在IE9中对我有用。

我在Chrome中尝试了它并且它无法正常工作,它会自动下载该文件,但我没有使用Chrome中的任何设置。 如果有人有跨浏览器解决方案,我会感兴趣。