假设遇到了一种极端情况,非要把 200G 的文件上载完以后才能处理,或者说直接存储起来吧,那让接收请求的模块一边接收一边写入文件就可以。硬盘的容量和内存比起来,就不是一个数量级了,容纳很多并发的请求都在上传大文件也没什么好怕的。我是说,它不会拖死服务器。如果硬盘空间快用光了,切断通讯就是,也不至于会拖死服务器。
=== 回答题主的问题 ===
HTTP 协议对于所谓大文件传输,超高速传输之类是没有限制的。估计所指的限制是说 TCP/IP 协议层面的问题。
HTTP 协议里面,通讯包头字段以后的 entity 数据区,是很干净的数据区,没有什么边角的浪费。如果能保持可靠的连接,您无休止传输一个永不知道最终大小的内容都是可行的。
如果通讯条件恶劣,下载大文件可以利用断点续传机制。上传大文件的“断点续传”印象里 HTTP 没有这方面的支持,但具体 Web 应用可以自定义一些机制。
=== 由于评论区有字数限制,我放在这里回复 ===
entity数据区是什么样子的?我举个例子说 表单提交 可以设置为是否是二进制提交方式 如棚山神果表单包含了文件处理的话 那么 这个entity数据区就是一个IO流 包括里面的名值对也被二进制拿出来了 如果不包含文件的表单 直接get提交 也会放在entity区中吗?还有这个entity区就是一楼答主所说的 web网络缓存区?
Form 提交可以是两个方式,一个是 Get,表单数据放在 URL 参数里面,也就是在 HTTP 通讯包的第一行发送出去;一个是 Post,表单数据放在 entity 里面。由于担心被攻击,Web Server 一般都限定了 URL 行的最大尺寸,所以稍大一些的表单一般都是通过 Post 方式提交的。
如果需要“提交”二进制的内容,比如上传一个很大的文件,那么整个文件链亏都是放在 entity 里面就可以了。不过 HTTP 里面提供了上传文件的特定方式,RFC1867,样子和一般 Form 提交有点类似,文件内容(和表单普通字段内容一起)是用一种 multipart 方式打包的,我在网上随便找了一段例子:
POST xxxx HTTP/1.1
Host: xxxx
Content-Length: 473
Content-Type: multipart/form-databoundary=----WebKitFormBoundaryW49oa00LU29E4c5U
------WebKitFormBoundaryW49oa00LU29E4c5U
Content-Disposition: form-dataname="myText"
hello world
------WebKitFormBoundaryW49oa00LU29E4c5U
Content-Disposition: form-dataname="upload1"filename="file1.txt"
Content-Type: text/plain
This is file1.
------WebKitFormBoundaryW49oa00LU29E4c5U
Content-Disposition: form-dataname="upload2"filename="file2.txt"
Content-Type: text/plain
This is file2, it's bigger.
------WebKitFormBoundaryW49oa00LU29E4c5U--
这个 multipart 方式大概是从 SMTP 协议里面借鉴过来的。如果用这种方式上传文件,那么很多现有的 Web Server 都可以理解的,开发成本较低。Web 浏览器的 file upload 机制就是用的上述方式,开发起来直接用,很方便。
但这不是唯一的方式。前端可以和 Web Server 或者其下具体的 Web 应用约定好,HTTP 请求里面的 entity 具体采用什么唯游打包方式。比如前端是一个专用 App,不是浏览器。
一、使用ulimit -a查看系统当前配置
# ulimit -a
core file size (blocks, -c) 1048575data seg size (kbytes, -d) 131072
file size (blocks, -f) 1048575
max memory size (kbytes, -m) 32768
open files (-n) 2000
pipe size (512 bytes, -p) 64
stack size (kbytes, -s) 32768
cpu time (seconds, -t) unlimited
max user processes (-u) 262144
virtual memory (kbytes, -v) unlimited
二、编辑ulimit默认配置文件/etc/security/limits,找到如下设置:
default:fsize = 2097151
三、将文件最大尺寸限制更改为无限制,如下:
default:fsize = -1
四、登出用户后,重新登录,再次查看文件大小限制:拍亩
# ulimit -a
core file size (blocks, -c) 1048575data seg size (kbytes, -d) 131072
file size (blocks, -f) 耐贺手unlimited
max memory size (kbytes, -m) 32768
open files (-n) 2000
pipe size (512 bytes, -p) 64
stack size (kbytes, -s) 32768
cpu time (seconds, -t) unlimited
max user 昌嫌processes (-u) 262144
virtual memory (kbytes, -v) unlimited
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)