我想将(单个)文件上传到服务器,并显示上传进度.

我知道我可以使用HTTP POST上传文件.我不熟悉web套接字,但据我所知,二进制数据也可以通过这种方式发送,因为web套接字是双向的,所以我可以了解上传的进度.

我不担心较旧的浏览器,所以iframe和flash解决方案不是很有吸引力,除非在这方面有显著优势.

我也很想知道最好的服务器端技术.与使用Django这样的WSGI服务器相比,他们有什么优势吗?或者像Node.js这样的非阻塞I/O技术?我不是问web框架x是比web框架y好,还是服务器x比服务器y好,而是问理想的技术应该具备哪些才能方便客户端的上传.

Update:It seems like the server side does not have bearing on the technologies/API's available on the client to facilitate uploads.

推荐答案

Edit(2017-10-17):到目前为止,还可以 Select 使用Fetch API.它提供了与XMLHttpRequest基本相同的功能,支持更现代的基于promise的API.对于本机不支持window.fetch()的浏览器(目前主要是Internet Explorer和较早的Safari版本),有一个polyfill.

XMLHttpRequest vs. Web sockets vs. Something else

显然是XMLHttpRequest美元.它在现代浏览器中的功能非常强大,几乎涵盖了所有场景.它将产生一个标准的POST或PUT请求,任何Web服务器和框架组合都可以处理.

虽然Web套接字在某些情况下很不错,但它是一种不同的协议,增加了很多复杂性-只有当您需要来自服务器的实时响应时,才值得使用它们.正如您自己指出的,其他方法,如Flash,只不过是丑陋的黑客手段.

Sending binary data

通常,您不能直接访问文件.因此,您的页面上将有一个<input type="file">表单域,等待用户 Select 一个文件.然后,选项包括:

  • 只发送文件内容:request.send(input.files[0]).请求正文将是文件的内容,而不是其他内容,不会执行编码,也不会传输像文件名这样的元数据.Browser compatibility:Chrome 7、Firefox 3.6、Opera 12、IE 10.
  • Sending the data of the entire form: request.send(new FormData(input.form)). 在这里,表单内容将被编码为multipart/form-data,这意味着您可以发送多个表单字段,并且还会传输字段和文件名等元数据.您也可以在发送之前发送modify the FormData object.根据服务器端框架的不同,处理此请求可能比处理原始数据更简单,通常可以使用许多帮助程序.Browser compatibility:Chrome 6、Firefox 4、Opera 12、IE 10.
  • Sending a typed array:以防你没有文件,只是想发送一些你在运行中生成的二进制数据.这里没有执行额外的编码,因此就服务器端而言,这就像发送文件内容一样有效.Browser compatibility:Chrome 9、Firefox 9、Opera 11.60、IE 10.

Displaying upload progress

你可以拿listen to progress events on XMLHttpRequest.upload美元.progress eventsloadedtotal个属性,可以用来确定您的请求已经完成了多少.Browser compatibility:Chrome 7、Firefox 3.5、Opera 11.60、IE 10.

JavaScript libraries

当然,现有的库包装了这里概述的功能.这些都是在其他答案中提到的,网上搜索肯定会出现更多.我明确地不想在这里建议任何库-如果有的话,您应该使用哪个库纯粹是一个偏好问题.

Django相关问答推荐

如何在Django中获取标记<;输入>;的';值';属性?

在Django的反向函数中添加动态URL

Django-HTMX:呈现到不同目标的表单验证错误

没有与给定查询匹配的监视列表

测试 - 两个类共享相同的登录代码,但它只能在一个类中工作

如何在两个字段上查找 django 模型的副本?

NoneType对象没有属性保存Django

在 PyCharm 中运行 Django 测试

将网络测功机添加到 Heroku django 应用程序时如何克服Coudn't find that formation错误?

Django中的单表继承

如何在 Django 模板上实现 back链接?

Django populate() 不可重入

django 复数模板

在python中查找对对象的所有引用

这是验证 Django 模型字段的方法吗?

Django表单集:首先需要?

Django ORM 能否以可靠的与后端无关的方式存储无符号 64 位整数(又名 ulong64 或 uint64)?

Django Rest Framework - 缺少静态目录

Django中的自定义排序

Django REST 框架中的每个字段权限