我需要向 ASP.NET 网站添加文件上传功能,并希望能够在服务器上的文件仍在上传时读取它的一小部分。一个窥视或预览类型的功能,这样我就可以确定内容并向用户提供一些反馈,同时还在上传(我们在这里讨论的是大文件)。有没有办法做到这一点?我正在考虑编写一个自定义控件的最坏情况,该控件一旦选择就只上传文件的固定数量的字节,然后在幕后开始另一个完整文件的上传。甚至不完全确定这是可能的,但无论如何我正在寻找一个更优雅的解决方案......谢谢!
2 回答
听起来您想在大文件上传期间避免“白屏死机”。如果是这样,您可能需要查看Telerik 的 RadUpload 控件,该控件在上传期间提供进度条。
如果你想自己动手,我会反编译他们的试用版以获得想法。我以这种方式查看了它们的源代码,它们通过自定义 HttpModule 和 HttpHandler 的组合以及它们的控件来完成进度条。处理程序以流式方式路由文件,而模块提供“完成百分比”信息 - 或相反;我看过它已经有几年了。
编辑:
实际上,我正在尝试进行服务器端处理,因为文件仍在上传中。我想通过 HTTP 导入用户数据,但想在文件仍在上传时向用户展示我们将如何处理他们的数据的预览/选项(列定义等)。无论如何,我们将按原样获取文件,因此不需要中断上传。鉴于我实际上希望在上传期间基于在上传文件时读取文件的相对较小部分进行交互,您仍然会推荐相同的方法吗?
嗯......这很难做到,而且它可能无法跨浏览器工作,但可以通过这种方法完成。
正如我所提到的,由于完全可以将传入文件作为流处理,因此您可以让初始处理更新某些状态作为流处理的一部分。如果您不作为流处理,则必须等待完整的文件上传,然后才能对其进行任何操作。
问题是:在文件上传期间,您不能再进行任何基于 HTML 的交互。帖子必须继续有增无减,否则上传将失败。我链接的控件根本不起作用,因为大多数浏览器允许 javascript 在发布期间继续执行和更新页面 DOM。
因此,为了完成这项工作,您必须在 HttpModule 中的文件处理期间更新一些标准化的服务器端状态,这些状态通过 HttpHandler 处理的 XmlHttpRequest 调用传输回客户端。您必须使用纯 javascript/DOM 来为用户更新 UI。
所以,正如我所说,它很复杂,并且可能是跨浏览器的错误,但理论上可以做到。
有些替代方案可能更稳定,但不一定可行:您可以构建一个 ActiveX 控件或 Click-Once .NET 应用程序,在上传前预处理文件,甚至可能在用户继续时异步传输文件浏览。有些用户可能不喜欢这个选项,而且我不知道您的部署方案的细节,但这是一个选项。
有HTTP
HEAD
方法但没有PEEK
。
HEAD
将为您提供有关文件的信息和标题。
当然,您可以创建一个特殊的请求处理程序来执行您想要的任何操作。您不必使用静态资源,您可以动态创建所需的任何响应。