为了减轻服务器(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;
}
}
分享到:
相关推荐
Umi-OCR-main.zip
基于springboot+Web的毕业设计选题系统源码数据库文档.zip
基于springboot校外兼职教师考勤管理系统源码数据库文档.zip
58商铺全新UI试客试用平台网站源码
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于SpringBoot的口腔诊所系统源码数据库文档.zip
数据存放网盘,txt文件内包含下载链接及提取码,永久有效。失效会第一时间进行补充。样例数据及详细介绍参见文章:https://blog.csdn.net/T0620514/article/details/143956923
3-240P2162218.zip
网络安全 基于Qt创建的Linux系统下的浏览器.zip
C++ 类和对象:多态-练习题目2(制作咖啡和茶叶)
基于springboot+J2EE在线项目管理与任务分配中的应用源码数据库文档.zip
简介本项目提供了一个在51单片机上运行的简单操作系统,旨在帮助学习者深入理解操作系统的基本原理和任务调度机制。该操作系统通过汇编和C语言编写,实现了任务调度、中断处理等核心功能,并提供了详细的源代码和注释,方便学习和实践。
本文将深度卷积神经网络(CNN)设计实现一个复杂结构的生成模型,旨在通过多阶段的编码器-解码器结构,能够有效地将灰度图像转换为彩色图像。最后,本文将实现一个简单的Web应用,用户可以通过上传灰度图像,应用会使用预训练的Caffe模型对其进行颜色化,并将结果返回给用户。 1.模型设计:模型由多个卷积层、ReLU激活函数和批归一化层组成,通过前向传播函数将输入的灰度图像(L通道)转换为彩色图像(ab通道)。如果指定了 pretrained=True,则会自动下载并加载预训练的模型权重。 2. 系统通过Flask框架提供了一个Web应用,用户可以上传灰度图像,系统会自动将其转换为彩色图像,并在网页上显示结果。整个过程包括文件验证、图像处理、颜色化预测和结果展示,具有较高的实用性和用户体验。
一个JAVA图形化的、联网的五子棋游戏.zip javaweb
KWDB 是一款面向 【AIoT 场景】的【分布式多模数据库】,支持在同一实例同时建立时序库和关系库并融合处理多模数据,具备千万级设备接入、百万级数据秒级写入、亿级数据秒级读取等时序数据高效处理能力,具有稳定安全、高可用、易运维等特点。
页面数量:7页 网页主题:网站模板、酒店网站模板、官方网站模板 网页页面:首页、关于我们、相关服务、服务详情、在线博客、博客详情、在线留言 页面实现元素:加载动画、滚动加载、主题切换、导航栏 、轮播图、图文列表、图片切换、 文字列表、 按钮悬停、图片悬停、表单 实现技术:HTML、CSS 、JQuery 源码样式及js文件均分开存放,所有内容仅供初学者学习参考
内容概要:本文档提供了详细的 Neo4j 安装与配置指南,涵盖 Windows、Linux 和 Mac 系统的安装步骤。具体包括下载、安装、启动服务、修改配置文件(如端口配置、远程访问和内存限制)、设置管理员密码以及基本的 Cypher 查询语言使用方法。同时,还提供了一些常见问题及其解决方案。 适合人群:数据库管理员、软件开发人员、系统管理员。 使用场景及目标:①帮助初学者快速掌握 Neo4j 的安装与配置;②适用于需要搭建和使用图数据库的项目;③为已有用户解决常见问题。 其他说明:本文档不仅包含了基础的安装和配置流程,还提供了实际操作中可能遇到的问题及其解决方法,有助于提高使用者的实际操作能力。
基于SpringBoot+Vue的软件产品展示销售系统源码数据库文档.zip
《书戴嵩画牛》教学课件.pptx
20届智能车 【项目资源】:包含前端、后端、移动开发、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源,毕业设计等各种技术项目的源码。包括C++、Java、python、web、C#、EDA等项目的源码。 【适用人群】:适用于希望学习不同技术领域的初学者或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。