如何从Sharepoint页面提示用户输入保存位置?

时间:2015-07-20 21:41:49

标签: c# sharepoint-2010 itextsharp prompt filesavepicker

我有一个相关的问题here,我试图创建一个指向已保存文件位置的链接(其中位置和文件名由用户负责)。遗憾的是,由于路径访问被拒绝,链接无法打开文件(如上面链接中的更新4中所述)。

真正宁愿做的事情,如果可能的话,提示用户提供一个保存位置(不要求他们输入类似于" C:\ Bla \的输入文本元素) Blee&#34);但是,我并不认为,从Sharepoint页面可以使用已经尝试过的并且不那么真实(在本例中)FileSaveDialog。

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

更新

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

更新2

通过创建指向该文件的链接(正如我所做的那样,如同here),我可以右键单击所述链接并选择" Save Taget As ..."然后执行此操作(出现一个"另存为"对话框,我可以将文件保存在我想要的任何地方)。在这种情况下,必须有一种方法以编程方式调用同一个对话框,而不是用户必须右键单击,然后选择一个菜单项("目标另存为..." ),他们可以简单地将链接和流行音乐混合起来,像狡猾的人,“拯救生命”和“#34;对话框。

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

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

1 个答案:

答案 0 :(得分:1)

我浏览了你的其他问题,我只是想确保我们对一些事情很清楚。 (如果这里的任何内容明显是明显的,请原谅我,我不打算侮辱我,我只是想确保我们在同一页上。)

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

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

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

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

  

隐含的建议是用户代理      不应该显示响应,而是直接输入“保存响应”      作为...'对话。

这是你最终想要实现的目标,对吗?

在您的情况下,单击PDF链接会绕过ASP.Net,IIS只会查找文件并发送application/pdf MIME类型。一个解决方法是取消注册PDF file extension from the system。然而,这可能不是最便携的解决方案。同样,您也可以将文件扩展名更改为application/octet-stream,然后您(可能)获取“另存为”对话框。

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