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

How can I prompt the user for a save location from a Sharepoint page?

我有一个相关问题 ,我试图在其中创建一个 link 到保存文件的位置(为用户处理位置和文件名)。不幸的是,由于路径访问被拒绝,link 无法打开文件(如上文 link 更新 4 中所述)。

如果可能的话,我真正宁愿做的是提示用户输入保存位置(不需要他们输入输入文本元素,例如"C:\Bla\Blee");不过,我不认为我可以从 Sharepoint 页面使用尝试过但不太真实的(在本例中)FileSaveDialog。

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

更新

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

更新 2

通过为文件创建一个link(正如我所做的,正如),我可以右键单击说link和select"Save Taget As..." 并这样做(出现 "Save As" 对话框,我可以将文件保存在任何我想要的地方)。在这种情况下,必须有一种方法以编程方式调用相同的对话框,这样用户就不必右键单击,然后 select 一个菜单项 ("Save Target As..."),他们可以简单地捣碎 link 并像黄鼠狼一样弹出 "Save As" 对话框。

那么我如何调用明显可调用的对话框来响应 link 单击?

如果看到 "Total and Payment Total do not match; Please enter the same amount for both values and try again." 必须重新显示表单(创建一个 "show_sections()" 函数并在保存按钮运行后调用它)?

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

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

其次,Right-click,另存为。当您 right-click a link 时,您正在调用浏览器的 built-in 专有菜单系统。该系统是浏览器 and/or OS-specific 并且未在任何规范中定义。在 90 年代,您可能已经能够使用 VBScript 来“发送密钥”并让 Internet Explorer“单击”link,但那些日子早已一去不复返了。与此最接近的现代等效项是编写一个我想你不想做的插件(并且将是浏览器 and/or OS-specific)。

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

根据 HTTP spec(19.5.1 第 3 段),如果除了 header 之外还发送 application/octet-stream 的 MIME 类型,请更深入地了解最后一个Content-Disposition: attachment; filename="fname.ext" 然后

the implied suggestion is that the user agent should not display the response, but directly enter a `save response as...' dialog.

这就是您最终要实现的目标,对吗?

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

我认为强制“另存为”对话框的最佳选择是创建某种处理程序 server-side 强制将 MIME 类型和内容处置 header 放入流中,并且然后传递文件的原始字节。您可以通过多种方式执行此操作,可能使用 IHttpHandler (maybe even better here) 或可能仅使用检查查询字符串的单个 ASPX 页面。您需要执行一些额外的安全措施,并且 绝对 确保您不允许 path-like 字符和文件名中的命令。