好吧,这可能看起来有点菜鸟问题,但我认识的许多 Web 开发人员并没有完全理解。
基本上,如何使用 FileUpload 控件的 uploaded 事件将文件从网页文件输入框上传到网络服务器(例如托管 .net 站点)?
我的理解是,向服务器发送了一个请求流的帖子,然后将其传回浏览器并开始将数据流式传输到服务器。
我的朋友说他的理解是整个文件被浏览器编码到 post 请求中,然后(大量)post 被发送到服务器。
我认为情况不可能是这样,就好像没有办法构建 ajax 进度条,因为服务器在收到整个帖子之前无法执行任何操作,此时它可能只是保存将文件复制到磁盘。
那么从浏览器到服务器它实际上是如何工作的?
你的朋友是对的。 如果您想要一个 AJAX 进度条,您必须克服一些困难。
通常,该技术是将 iframe 内的上传发布到服务器上的 IHttpHandler,该服务器将服务器上的进度存储在服务器范围的字典中,该字典由客户端组成并包含在 AJAX 进度请求和上传帖子中的标识符键入。 这样,当客户端发出 AJAX 请求时,处理该请求的服务器代码可以从该字典中读取值,以查看服务器已处理的文件 POST 请求的字节数。
是的,这很复杂:)
我认为你的朋友是对的,该文件被编码到发送到服务器的帖子中。 如果您确实想确切地了解它是如何工作的,请尝试在 Firefox 中使用 Tamper Data 来查看实际的帖子数据。
预计到达时间:
AJAX 风格上传您提到的工作,方法是在隐藏的 iframe 中进行发布,然后使用 AJAX 请求在服务器端检查上传进度。
现在(2024 年)似乎浏览器中有一个 标准 API 可以获取有关上传进度的信息。此功能在 Web Workers 中可用,但 Service Workers 除外。这样做的示例是在这个科幻答案中。