`
rensanning
  • 浏览: 3516088 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:37533
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:604468
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:678313
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:87397
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:399929
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69104
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:90573
社区版块
存档分类
最新评论

Web服务中上传文件大小的限制

 
阅读更多
为了减轻服务器(CPU/内存/网络带宽)负荷,避免DDoS攻击,必须限制客户端的文件上传大小。

常用兆和字节对应表:
引用
  1 MB  =  1048576 B
  2 MB  =  2097152 B
  5 MB  =  5242880 B
10 MB  =  10485760 B
20 MB  =  20971520 B
50 MB  =  52428800 B
100 MB  =  104857600 B
200 MB  =  209715200 B


一般请求的处理流是:客户端 -> Web服务器 -> Web容器 -> 框架。
所以在任何一个环节都可以对文件大小进行限制。

(1)客户端限制

常用的开源文件上传组件都可以限制文件大小。

jQuery-File-Upload:maxFileSize
https://github.com/blueimp/jQuery-File-Upload/wiki/Options

plupload:max_file_size
https://github.com/moxiecode/plupload/wiki/Options#filters.max_file_size

Dropzone:maxFilesize
http://www.dropzonejs.com/#config-maxFilesize

FineUploader:sizeLimit
https://docs.fineuploader.com/features/validation.html

(2)Web服务器限制

Nginx:client_max_body_size(ngnix.conf)
http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
默认是1MB,超过后直接返回413 (Request Entity Too Large) 。设置为0时表示无限制。

server {

    client_max_body_size 1m;

    location /users/profile/edit/avatar {
        client_max_body_size 2m;
    }

    location /users/profile/edit/images {
        client_max_body_size 5m;
    }

}


Apache:LimitRequestBody(.htaccess)
https://httpd.apache.org/docs/2.4/en/mod/core.html#limitrequestbody
默认为0(无限制),可以指定0到2GB的数值。

<VirtualHost *:8000>

    <Location />
        LimitRequestBody 1048576
    </Location>

    <Location /users/profile/edit/avatar>
        LimitRequestBody 2097152
    </Location>

    <Location /users/profile/edit/images>
        LimitRequestBody 5242880
    </Location>

</VirtualHost>


PHP:upload_max_filesize(php.ini)
引用
memory_limit = 40M
post_max_size = 32M
upload_max_filesize = 32M


(3)Web容器限制

Tomcat连接器:maxPostSize(server.xml)
http://tomcat.apache.org/tomcat-8.5-doc/config/ajp.html
http://tomcat.apache.org/tomcat-8.5-doc/config/http.html
默认是2MB。设置为0时表示无限制。

<Connector port="8009"
           protocol="AJP/1.3"
           redirectPort="8443"
           maxPostSize="10485760" /> <-10MB

<Connector port="8080" 
           protocol="HTTP/1.1"
           redirectPort="8443"
           maxPostSize="10485760"/> <-10MB


Servlet 3.0:multipart-config(web.xml)
<multipart-config>
    <location>/tmp</location>
    <max-file-size>5242880</max-file-size>
    <max-request-size>10485760</max-request-size>
    <file-size-threshold>32768</file-size-threshold>
</multipart-config>


或Servlet类注解:
@MultipartConfig(
    location="/tmp",
    maxFileSize=5242880,
    maxRequestSize=10485760,
    fileSizeThreshold=32768
)


(4)框架限制

SpringBoot设置:
#application.properties
spring.http.multipart.max-file-size=5MB
spring.http.multipart.max-request-size=10MB


Java配置
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setMaxFileSize("5MB");
        factory.setMaxRequestSize("10MB");
        return factory.createMultipartConfig();
    }

默认采用StandardServletMultipartResolver ,所以上边的定义和Servlet 3.0的定义是一致的。也可以采用CommonsMultipartResolver。

Apache Commons Upload设置:
    @Bean
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver cmr = new CommonsMultipartResolver();
        cmr.setMaxUploadSize(10485760);
        cmr.setMaxUploadSizePerFile(5242880);
        return cmr;
    }



文件大小限制后,超大文件如何上传?

Spring MVC大文件的断点续传 这篇文章说的是如何下载大文件,和如何上传大文件很类似,把大文件分割成小的chunks逐个上传。需要的是浏览器端和服务器端都支持才行。

浏览器
如果浏览器自身支持的话,大多数开源组件都能做分割上传,
比如jQuery-File-Upload可以指定maxChunkSize参数:https://github.com/blueimp/jQuery-File-Upload/wiki/Chunked-file-uploads
$(function () {
    $('#upload').fileupload({
        url: 'http://localhost:8080/upload',
        type: "POST",
        dataType: 'json',
        singleFileUploads: true,
        autoUpload: true
    });
    
    $('#uploadChunked').fileupload({
        url: 'http://localhost:8080/upload',
        type: "POST",
        dataType: 'json',
        singleFileUploads: true,
        autoUpload: true,
        maxChunkSize: 1048576
    });
});


服务器
接收文件数据时就需要特殊处理一下。
- 根据HTTP头部是否有Content-Range参数分成两个不同方法
- 如果是Chunk上传的话,第一次为创建文件,之后皆是往文件中追加内容
@RestController
public class UploadController {

	private static final String FILE_DIR = "d:\\";
	private static final Pattern RANGE_PATTERN = Pattern.compile("bytes ([0-9]+)-([0-9]+)/([0-9]+)");

	@PostMapping(value = "/upload", headers = "!Content-Range")
	public Map<String, String> uploadMultipart(@RequestParam("file") final MultipartFile file, HttpServletResponse res) throws Exception {
		String fileName = file.getOriginalFilename();
		File source = new File(FILE_DIR + fileName);
		file.transferTo(source);

		Map<String, String> result = new HashMap<String, String>();
		result.put("name", FILE_DIR + fileName);
		return result;
	}

	@PostMapping(value = "/upload", headers = "Content-Range")
	public Map<String, String> uploadChunked(HttpServletRequest req, HttpServletResponse res) throws Exception {

		String contentRange = req.getHeader("Content-Range");
		String begin = "";
		Matcher matcher2 = RANGE_PATTERN.matcher(contentRange);
		if (matcher2.matches()) {
			begin = matcher2.group(1);
		}

		MultipartHttpServletRequest multiReq = (MultipartHttpServletRequest) req;
		MultipartFile f = multiReq.getFile("file");
		String fileName = f.getOriginalFilename();

		if ("0".equals(begin)) {
			File source = new File(FILE_DIR + fileName);
			f.transferTo(source);
		} else {
			Path file = Paths.get(FILE_DIR, fileName);
			Files.write(file, f.getBytes(), StandardOpenOption.APPEND);
		}

		Map<String, String> result = new HashMap<String, String>();
		result.put("name", FILE_DIR + fileName);
		return result;
	}

}
1
0
分享到:
评论

相关推荐

    Asp.Net上传文件大小限制

    Asp.Net上传文件大小限制

    上传文件jsweb前端(包含文件格式限制)

    内含多种上传方式,有一个特别详细的,对文件格式,文件大小都有限制的,仿制163网盘文件上传的页面。基本所有的文件上传功能都实现了。

    解决文档服务器上传文件2M限制1

    到主程序hrwebapp目录下打开Web.config文件复制如下代码: useFullyQualifiedRedirectUrl="t

    Uplodify的一个实例(重点是上传大小的限制)

    简单的uploadify的上传例子,重点是上传大小限制的问题,在这里面解决了,虽然不是什么大问题,但也挺头痛的,解决方法主要是在参数设置部分和配置文件部分

    使用Netty搭建WebSocket服务器,可修改单包大小限制

    使用Netty搭建WebSocket服务器,该资源示范如何修改单包大小限制,解决不能发送大数据包的问题。

    自定义上传文件限制大小

    在&lt;system.web&gt;里添加下面一段代码就可以了

    Silverlight文件上传源码

    可以上传比较大的文件,开发者有能力限制文件大小和文件总大小,不是限制maxRequestLength在web.config中。上传控件上传文件以文件快形式,但是这远远超过了webservice中所使用的4MB,默认maxRequestLength值,可以...

    Web.Config文件配置之限制上传文件大小和时间的属性配置

    在Web.Config文件中配置限制上传文件大小与时间字符串时,是在&lt;httpRuntime&gt;&lt;httpRuntime&gt;节中完成的,需要设置以下2个属性:maxRequestLength属性:用于防止服务器攻击,例如因用户向服务器发送大型文件而导致的...

    修改Nginx与Apache上传文件大小限制

    我们使用 ngnix 做 web server 的时候,nginx 对上传文件的大小有限制。 这个时候我们要修改 nginx 参数。 sudo vim /etc/nginx/nginx.conf #在http段里面添加: client_max_body_size 100m; //举例设置上传最大值为...

    解决asp无组件文件上传及下载大小限制

    解决asp无组件文件上传及下载大小限制。

    web中Flash+js本地判断上传图片大小

    一般的js本地判断在某些浏览器上是不兼容的,而本款是通过flash +Js进行本地判断大小后并上传,解决部分人上传超大文件页面报错,以及上传大文件服务压力大的问题。 falsh + js判断哦。准确而安全。 iis配置指向文件...

    奇安信代码卫士,文件上传漏洞解决demo

    (3)对单个文件大小和总文件数进行限制, 避免拒绝服务攻击。 (4)对文件名进行输入校验,显示时进行输出编码。 3. 文件存储: (1)上传文件应保存在指定路径下。 (2)对上传文件进行随机数重命名,避免文件被...

    如何限制asp.net中上传文件的大小的代码

    在web.config中控制上传文件大小的地方: 代码如下: &lt;system&gt;&lt;httpRuntime executionTimeout=”9999″ maxRequestLength=”2097151″/&gt;&lt;/system&gt; maxRequestLength是控制上传大小得参数请求的最大大小(以千字节为...

    Asp.Net修改上传文件大小限制方法

    本文主要分享了Asp.Net修改上传文件大小限制的方法--修改web.config,需要的朋友可以看下

    完整java上传附件案例,SSH2架构,开源

    3. 对上传文件前检测同名文件,以及上传文件的大小限制 4. 包含中文名称的文件上传、附件上传成功后,在数据库表中插入一条记录,记录信息包括一个随机字符的字段,在下载时候通过该字段找到相应的附件 5. 上传文件...

    Web服务中大数据传送方案

    这里提供一个方案来处理 Web 服务的大数据传输(图 1)。 它由两部分软件组件构成:客户端组件库和服务器 端组件库。Web 服务中的“消费者”...XML 元素并存储到一个 XML 文件,然后将这个文件上传 到 Web 容器中去。

    LyfUpload.dll 经典刘云峰无组件上传

    可以得到上传文件的大小 (1.1版新增功能) 支持将文件内容保存进数据库,如上载图形文件、DOC文件等各类Windows文件 (1.1版新增功能) 支持从数据库中读取上载文件到数据库中的记录,如显示图形文件、DOC文件等各类...

    web截图上传和邮发到邮箱

    4.截取的图片目前上传的WEB地址假设是www.baidu.com,如果你有实际可以上传文件的URL,替换代码中的所有www.baidu.com即可 5.在TEST.vbs和TEST.html中的代码行:filename=ScreenShot.DoScreenShot("gif",false),如果把...

Global site tag (gtag.js) - Google Analytics