FileStreamResult和自定义httphandler

时间:2013-09-04 16:11:37

标签: c# asp.net-mvc stream httphandler

我为DocX文件编写了一个自定义httphandler,我正试图通过iframe显示这些文件。

这是我的控制器:

    public ActionResult LoadDOC(string path)
    {
        var fsSource = new FileStream(path, FileMode.Open, FileAccess.Read);
        return new FileStreamResult(fsSource, "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
        {
            FileDownloadName = "newfile.docx"
        };
    }

}

需要更改文件名,以便httphandler可以获取它。这些文件驻留在没有扩展名的文件服务器上(它们被重命名为guid)。 例如:

"\\\\fileservername\\Documents\\811943a3-56f7-42cb-8450-1b8319a426b4\\633d9f3e-df99-408e-b59c-ec8efa4fa41f"

我无法更改文件驻留在服务器上的方式,我必须通过代码添加扩展名。

当在iframe中执行上述操作时,会立即下载该文件。然而,PDF文件和文本文件正确呈现。

这是自定义的httphandler:

      <add name="DOCXhandler" path="*.docx" verb="GET" type="MyProject.Handlers.DocxHandler, MyProject" preCondition="integratedMode" />

如何使用此方法更改文件流扩展名,或者使用其他方法来实现iframe中显示的文件所需的结果?

是否可以按内容类型更改处理程序?

编辑:问题清晰;

  • 是否可以按内容类型而不是文件扩展名来使http处理程序工作?
  • 如何在iframe中显示时,如何确保filestreamresult使用我的自定义httphandler for .docx文件?
  • 我是以正确的方式解决这个问题,还是我错过了什么?

2 个答案:

答案 0 :(得分:0)

考虑将“.docx”扩展名添加到文件的呈现Url,而不是删除LoadDoc行动(即廉价黑客 - path = path.Replace(".docx", ""),更喜欢使用Path类中的方法来执行此操作操纵)。

附注:从安全角度来看,暴露服务器端文件路径通常是个坏主意。

答案 1 :(得分:0)

我实际上很难解决这个问题。

我改变了控制器将iframe设置为实际虚拟文件路径的方式: 例如:“localhost / Project / 12345_6789.docx”,其中12345是组标识符,6789是文档标识符。

我制作的httphandler需要这些,并将文件路径更改为: “//// fileserverpath / documentspath /6789分之12345”

我不再直接通过控制器传输文件,而是通过我的请求处理程序。

希望这有助于那里的人!