0

我已经为 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 用于 .docx 文件?
  • 我是以正确的方式解决这个问题,还是我错过了什么?
4

2 回答 2

0

考虑将“.docx”扩展名添加到文件中呈现的 Url,而不是将其删除您的LoadDoc操作(即便宜的 hack - path = path.Replace(".docx", ""),更喜欢使用Path类中的方法来执行该操作)。

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

于 2013-09-04T16:34:09.030 回答
0

实际上,我对这个问题的处理非常糟糕。

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

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

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

希望这可以帮助那里的人!

于 2013-09-05T01:05:33.247 回答