1

我有一个创建文件并将其提供给浏览器的 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

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

4

3 回答 3

2

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

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

另一件事是您为 TXT 文件指定了 octect-stream

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

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

什么内容类型可以强制下载文本响应?

于 2013-08-29T15:03:27.220 回答
1

如果您希望浏览器打开 jpg 或 pdf 或 xls,您需要在“ContentType”标题中指定正确的 mime 类型。例如,现在您将所有内容输出为“八位字节流”,这是非常通用的。浏览器无法猜测哪个程序会打开这样的泛型类型。但是,如果它是 xls,您可以使用“application/vnd.ms-excel”的 ContentType。

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

于 2013-08-29T15:14:52.830 回答
1

如果客户端计算机知道如何打开文件扩展名,您实际上可以这样做。我已经让它在IE9中工作了


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

Pre-Rec:客户端计算机应.xyz注册文件扩展名,以使用您希望它打开的每个程序打开。如何在这里: http: //windows.microsoft.com/en-us/windows-vista/change-which-programs-windows-uses-by-default

第 1 步:在 IIS 中设置一个新的 MIME 类型,其属性为文件扩展名 =.xyz和 MIME 类型 = `application/xyz" 如何在此处:http://technet.microsoft.com/en-us/library/cc725608( v=ws.10).aspx

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

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 中使用任何设置。如果有人有跨浏览器解决方案,我会感兴趣。

于 2013-08-29T15:49:02.580 回答