0

我在这里有一个相关的问题,我试图创建一个指向已保存文件位置的链接(其中位置和文件名由用户处理)。不幸的是,由于路径访问被拒绝(如上面链接中的更新 4 中所述),该链接不会打开文件。

如果可能的话,我真正想做的是提示用户输入保存位置(不需要他们输入诸如“C:\Bla\Blee”之类的输入文本元素);不过,我不认为我可以从 Sharepoint 页面使用经过验证且不那么真实的(在这种情况下)FileSaveDialog。

是否有任何替代方案或解决方法,以便我可以提示用户提供位置?

更新

我认为这不会尝试在客户端保存生成的文件,因为它是在服务器端生成的(通过 iTextSharp)。

更新 2

通过创建指向文件的链接(正如我所做的那样,如此处所示),我可以右键单击所述链接并选择“Save Taget As...”并这样做(出现“另存为”对话框,我可以将文件保存在我想要的任何位置)。在这种情况下,必须有一种方法以编程方式调用相同的对话框,这样用户就不必右键单击,然后选择一个菜单项(“目标另存为...”),他们可以简单地混合链接和弹出,类似鼬鼠,“另存为”对话框。

那么我如何调用那个明显可调用的对话框来响应链接点击呢?

如果看到“总额和付款总额不匹配;请为两个值输入相同的金额,然后重试。” 必须重新显示表单(创建一个“show_sections()”函数并在保存按钮运行后调用它)?

4

1 回答 1

1

我浏览了你的其他问题,我只是想确保我们清楚一些事情。(如果这里有什么是盲目的,请原谅我,我无意侮辱,我只是想确保我们在同一页上。)

首先,客户端和服务器。任何服务器端都在用户帐户的上下文中运行,并且与运行它的机器相关。如果您使用服务器端代码说“将其保存到桌面”,那么这是服务器的本地进程的桌面,几乎没有任何意义。但是,如果您正在模拟登录用户,这可能会起作用,除非您将其保存到服务器上登录用户的桌面。如果客户端和服务器在同一台机器上运行并且您正在模拟客户端,那么这实际上可能完全有效。也许。

其次,右键单击,另存为。当您右键单击链接时,您正在调用浏览器的内置专有菜单系统。该系统是特定于浏览器和/或操作系统的,并且没有在任何规范中定义。在 90 年代,您可能已经能够使用 VBScript 来“发送密钥”并让 Internet Explorer “单击”该链接,但那些日子早已一去不复返了。与此最接近的现代等价物是编写一个我想您不想做的插件(并且将是浏览器和/或特定于操作系统的)。

三、MIME类型。一般来说,每个 HTTP 响应都包含一个 MIME 类型,它指定服务器发送字节的意图。text/html其中包括和之类的东西application/pdf。当服务器端代码 (ASP.Net) 没有被调用时,例如图像和 CSS 等静态文件,甚至是 PDF 等预生成文件,服务器 (IIS) 在列表中查找文件扩展名以确定什么要发送的 MIME 类型。在客户端,浏览器使用 MIME 类型来确定要执行的操作。如果是text/html它(可能)呈现 HTML。如果是,application/pdf那么浏览器会查看它的MIME 类型列表,以查看是否有任何应用程序注册了该 MIME 类型。大多数现代浏览器都有一个内置的 PDF 渲染器,因此浏览器只需将字节传递给它进行渲染。如果浏览器不知道那个 MIME,它可能会询问操作系统它是否知道它并且有一个可用的注册处理程序,如果有,它会通过它。如果这一切都失败了(可能是因为像我这样的用户禁用了特定的 MIME 类型),那么浏览器要么只是将这些字节放入“下载”文件夹,它会尝试将这些字节解释为文本或提示保存。

根据HTTP 规范(19.5.1 第 3 段),深入了解最后一个,如果您发送一个 MIME 类型以及thenapplication/octet-stream的标头Content-Disposition: attachment; filename="fname.ext"

暗示的建议是用户代理不应该显示响应,而是直接输入“将响应另存为...”对话框。

这就是你最终想要达到的目标,对吧?

在您的情况下,单击 PDF 链接会绕过 ASP.Net,而 IIS 只是查找文件并将application/pdfMIME 类型连同它一起发送。一种解决方法是从系统中注销PDF 文件扩展名。然而,这可能不是最便携的解决方案。同样,您也可以将文件扩展名更改为application/octet-stream,然后您(可能)会看到“另存为”对话框。

我认为强制“另存为”对话框的最佳选择是创建某种服务器端的处理程序,该处理程序将 MIME 类型和 Content Disposition 标头强制放入流中,然后传递文件的原始字节。您可以通过多种方式执行此操作,可能使用(这里IHttpHandler可能更好)或者可能仅使用检查查询字符串的单个 ASPX 页面。您将需要执行一些额外的安全措施,并且一定要确保文件名中不允许出现类似路径的字符和命令。

于 2015-07-21T14:48:54.817 回答