为了减轻服务器(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;
}
}
分享到:
相关推荐
C#.Net上传文件大小限制设置可以通过修改IIS6.0中的metabase.XML文件、使用Metabase Explorer工具或修改.NET中的web.config文件或machine.config文件来实现。我们可以根据实际需要选择合适的方法,以满足不同的上传...
除了IIS设置外,你还可以通过修改Web.config文件来限制上传文件大小。在`<system.web>`或`<system.webServer>`部分添加以下代码: ```xml <system.web> <!-- 用于ASP.NET 2.0/3.5 --> </system.web> <system....
### PHP上传文件大小限制的解决办法 在进行Web开发时,常常会遇到用户需要上传文件的需求。对于较大的文件上传,可能会出现上传失败的情况,这主要是因为PHP对上传文件的大小有限制。本文将详细介绍如何调整PHP配置...
- 在Struts的配置文件(如`struts-config.xml`或`struts2.xml`)中,可以自定义拦截器来处理文件大小限制。例如,在Struts 2中,可以使用`FileUploadInterceptor`并设定`maximumSize`属性。 3. **Java代码控制**:...
在IT行业中,尤其是在Web应用程序开发和部署环境中,经常会遇到上传文件大小限制的问题。这篇内容主要讲解如何解决在文档服务器上上传文件时遇到的2M大小限制。这个问题通常出现在基于ASP.NET框架的应用程序中,因为...
### 一、理解.NET上传文件大小限制 #### 1. HttpWorkerRequest与限制 上传文件的大小限制首先由`HttpWorkerRequest`类决定,这是一个用于处理HTTP请求的核心类。默认情况下,.NET框架为了防止服务器资源被过大文件...
- 需要注意的是,除了Tomcat内部的配置之外,可能还需要检查操作系统层面或其他中间件(如防火墙或负载均衡器)是否也有限制上传文件大小的设置。 #### 进一步分析 - **配置理解** `max-file-size`和`max-...
在处理大型数据库或进行大规模数据导入时,我们经常会遇到phpMyAdmin上传文件大小限制的问题,这通常是由于服务器的默认设置无法满足大文件上传需求所致。本文将深入探讨如何有效地解决phpMyAdmin上传文件大小限制的...
- **改善用户体验**: 合理设置文件大小限制,可以让用户了解哪些文件是可以接受的,减少因上传失败而造成的不便。 #### 4. 实现步骤 1. **打开web.config文件**: 使用文本编辑器打开项目根目录下的`web.config`文件...
例如,如果希望将最大上传文件大小设置为40MB(40960KB),可以添加以下代码: ```xml <system.web> </system.web> ``` 这里的`maxRequestLength`属性值设为了40960KB,即40MB。同时,`...
- **错误处理**:确保处理可能出现的异常,例如文件大小超出限制、文件类型不合法等。 2. **文件下载**: - **控制器方法**:创建一个带有`[HttpGet]`属性的控制器方法,该方法根据请求的URL找到文件并准备发送。...
在IT领域,服务器上传文件大小扩大是一个常见的需求,特别是在处理大量数据、图片、视频或大型软件更新时。本文将深入探讨如何实现这一功能,涉及的知识点包括服务器配置、网络协议限制、编程语言处理大文件的方法...
在Asp.Net中,上传文件是一项常见的功能,但默认情况下,系统对单个文件的上传大小有限制。...在M055上传文件大小限制的压缩包文件中,可能包含了更具体的代码示例或教程,帮助你理解和实现这些配置。
在Web开发与服务器管理领域,文件上传是一项常见的需求,然而,默认情况下,Windows Server 2008(简称Win2008)搭配的Internet Information Services 7(简称IIS7)对上传文件的大小存在限制。这一限制可能会影响...
4. **文件大小限制**:通过File对象的`size`属性获取文件大小,然后与预设的大小限制进行比较。如果超过限制,可以提示用户并阻止上传。 5. **模拟进度条**:为了提升用户体验,项目可能采用了AJAX异步上传,同时...
ASP.NET是微软开发的一种用于...总的来说,限制ASP.NET中的上传文件大小是一项重要的安全措施,涉及到IIS配置、Web.config设置以及前后端代码的配合。正确地实施这些策略,可以有效地保护服务器资源,防止恶意攻击。
例如,我们可以限制上传文件的大小,只接受特定类型的文件,并对文件内容进行扫描以防止恶意代码。 ```csharp // 添加验证逻辑 foreach (var file in provider.Contents) { var contentDisposition = file.Headers...
在网页应用中,用户上传文件是一项常见的功能,但为了服务器性能和用户体验,通常需要对上传文件的大小进行限制。本文将深入探讨如何使用JavaScript来实现这一功能,通过前端验证,防止大文件上传导致的网络延迟或者...
要限制文件大小,可以在接收文件前检查`HttpPostedFileBase`对象的`ContentLength`属性,确保它不超过设定的最大值。 2. **文件修改** 文件修改通常涉及到读取现有文件内容,进行编辑,然后重新写入。在C#中,可以...
- 文件大小限制:默认情况下,ASP.NET对上传文件的大小有限制,需要在Web.config中调整`maxRequestLength`和`httpRuntime.maxRequestLength`参数。 - 安全性:确保对上传的文件进行验证,防止恶意文件上传,例如检查...