웹 서비스의 업로드 파일 크기 제한
7901 단어 디자인 관련
일반적인 메가바이트 및 바이트 대응 테이블:
[quote] 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[/quote]
일반 요청의 처리 흐름은 클라이언트 -> 웹 서버 -> 웹 컨테이너 -> 프레임워크입니다.
그래서 어떤 부분에서든 파일 크기를 제한할 수 있다.
[b] (1) 클라이언트 제한 사항 [/b]
자주 사용하는 소스 파일 업로드 구성 요소는 파일 크기를 제한할 수 있습니다.
jQuery-File-Upload:maxFileSize
[url=https://github.com/blueimp/jQuery-File-Upload/wiki/Options]https://github.com/blueimp/jQuery-File-Upload/wiki/Options[/url]
plupload:max_file_size
[url=https://github.com/moxiecode/plupload/wiki/Options#filters.max_file_size]https://github.com/moxiecode/plupload/wiki/Options#filters.max_file_size[/url]
Dropzone:maxFilesize
[url=http://www.dropzonejs.com/#config-maxFilesize]http://www.dropzonejs.com/#config-maxFilesize[/url]
FineUploader:sizeLimit
[url=https://docs.fineuploader.com/features/validation.html]https://docs.fineuploader.com/features/validation.html[/url]
[b] (2) 웹 서버 제한 사항 [/b]
[b]Nginx:client_max_body_size(ngnix.conf)[/b]
[url=http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size]http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size[/url]
기본값은 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;
}
}
[b]Apache:LimitRequestBody(.htaccess)[/b]
[url=https://httpd.apache.org/docs/2.4/en/mod/core.html#limitrequestbody]https://httpd.apache.org/docs/2.4/en/mod/core.html#limitrequestbody[/url]
기본값은 0이며 0에서 2GB 사이의 값을 지정할 수 있습니다.
LimitRequestBody 1048576
LimitRequestBody 2097152
LimitRequestBody 5242880
[b]PHP:upload_max_filesize(php.ini)[/b]
[quote]memory_limit = 40M
post_max_size = 32M
upload_max_filesize = 32M[/quote]
[b] (3) 웹 컨테이너 제한 [/b]
[b] Tomcat 커넥터: maxPostSize(server.xml)[/b]
[url=http://tomcat.apache.org/tomcat-8.5-doc/config/ajp.html]http://tomcat.apache.org/tomcat-8.5-doc/config/ajp.html[/url]
[url=http://tomcat.apache.org/tomcat-8.5-doc/config/http.html]http://tomcat.apache.org/tomcat-8.5-doc/config/http.html[/url]
기본값은 2MB입니다.0으로 설정하면 제한이 없음을 나타냅니다.
protocol="AJP/1.3"
redirectPort="8443"
maxPostSize="10485760" />
protocol="HTTP/1.1"
redirectPort="8443"
maxPostSize="10485760"/>
[b]Servlet 3.0:multipart-config(web.xml)[/b]
/tmp
5242880
10485760
32768
또는 서브렛 클래스 메모:
@MultipartConfig(
location="/tmp",
maxFileSize=5242880,
maxRequestSize=10485760,
fileSizeThreshold=32768
)
[b] (4) 프레임 제한 [/b]
[b] SpringBoot 설정: [/b]
#application.properties
spring.http.multipart.max-file-size=5MB
spring.http.multipart.max-request-size=10MB
[b]Java 구성 [/b]
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("5MB");
factory.setMaxRequestSize("10MB");
return factory.createMultipartConfig();
}
기본값은 Standard Servlet Multipart Resolver를 사용하기 때문에 위의 정의와 Servlet 3.0의 정의는 일치합니다.CommonsMultipartResolver도 사용할 수 있습니다.
[b] Apache Commons Upload 설정: [/b]
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver cmr = new CommonsMultipartResolver();
cmr.setMaxUploadSize(10485760);
cmr.setMaxUploadSizePerFile(5242880);
return cmr;
}
[color=blue][b] 파일 크기 제한 후 초대형 파일은 어떻게 업로드합니까?[/b][/color]
[url=http://rensanning.iteye.com/blog/2248760spring MVC 큰 파일의 단점 속편 [/url] 이 글은 큰 파일을 어떻게 다운로드하는지, 큰 파일을 어떻게 업로드하는지와 유사하게 큰 파일을 작은 chunks로 나누어 업로드합니다.브라우저와 서버가 모두 지원되어야 합니다.
[b] 브라우저 [/b]
브라우저 자체가 지원한다면 대부분의 소스 구성 요소는 분할하여 업로드할 수 있습니다.
예를 들어 jQuery-File-Upload는 maxChunkSize 매개 변수를 지정할 수 있습니다. [url=https://github.com/blueimp/jQuery-File-Upload/wiki/Chunked-file-uploads]https://github.com/blueimp/jQuery-File-Upload/wiki/Chunked-file-uploads[/url]
$(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
});
});
[b] 서버 [/b]
파일 데이터를 받을 때 특별히 처리해야 한다.
- 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 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 result = new HashMap();
result.put("name", FILE_DIR + fileName);
return result;
}
@PostMapping(value = "/upload", headers = "Content-Range")
public Map 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 result = new HashMap();
result.put("name", FILE_DIR + fileName);
return result;
}
}