【问题标题】:How can I prompt the user for a save location from a Sharepoint page?如何从 Sharepoint 页面提示用户输入保存位置?
【发布时间】:2015-07-20 21:41:49
【问题描述】:

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

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

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

更新

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

更新 2

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

那么我怎样才能调用那个明显可调用的对话框来响应链接点击呢?

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

【问题讨论】:

    标签: c# sharepoint-2010 itextsharp prompt filesavepicker


    【解决方案1】:

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

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

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

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

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

    暗示的建议是用户代理 不应该显示响应,而是直接输入一个`save response 作为...的对话框。

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

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

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

    【讨论】:

    • 克里斯,感谢您的出色回答;但我将如何“......只需将文件扩展名更改为 application/octet-stream”?这是否意味着将其从 .pdf 更改为其他内容?如果有,是什么?
    • 在 IIS 中,如果您转到 MIME 类型部分,您可以覆盖该特定文件扩展名的 MIME 类型。这个page 介绍了一般流程。
    • 我会注意到,然而,通过配置更改系统默认值通常会在几年内落入“哦,是的,我忘了我做了那个”的类别,这会导致头发被拔掉。我强烈建议只创建一个简单的处理程序。
    • 阅读this answer 了解一些背景知识,但请记住,在一个 HTTP 请求中,您可以将 HTML 返回给客户端,也可以将 PDF 返回给客户端,但不能同时使用两者(至少在 1.1 中)。如果您想提供带有选项的漂亮 HTML 消息,那么您将需要保存 PDF 服务器端(或按需生成)并使用处理程序。如果您只想提示保存,请使用Response.BinaryWrite() 写入 MemoryStream 的 `ToArray() 的内容。
    • 为了清楚起见,服务器无法指定它将保存在客户端计算机上的哪个位置。绝不。您不会在过去、现在或未来的任何规范中找到这一点。允许服务器建议 文件名,但浏览器被明确告知忽略任何路径组件。浏览器也会定期更改服务器发送的 suggestion
    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 2010-10-20
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    相关资源
    最近更新 更多