diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/MultiPartConfigFactory.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/MultiPartConfigFactory.java new file mode 100644 index 00000000000..59bff9b7a5d --- /dev/null +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/MultiPartConfigFactory.java @@ -0,0 +1,123 @@ +/* + * Copyright 2012-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.context.embedded; + +import javax.servlet.MultipartConfigElement; + +import org.springframework.util.Assert; + +/** + * Factory that can be used to create a {@link MultipartConfigElement}. Size values can be + * set using traditional {@literal long} values or using more readable {@literal String} + * variants that accept KB or MB suffixes, for example: + * + *
+ * factory.setMaxFileSize("10Mb");
+ * factory.setMaxRequestSize("100Kb");
+ * 
+ * + * @author Phillip Webb + */ +public class MultiPartConfigFactory { + + private String location; + + private long maxFileSize = -1; + + private long maxRequestSize = -1; + + private int fileSizeThreshold = 0; + + /** + * Sets the directory location where files will be stored. + */ + public void setLocation(String location) { + this.location = location; + } + + /** + * Sets the maximum size allowed for uploaded files. + * @see #setMaxFileSize(String) + */ + public void setMaxFileSize(long maxFileSize) { + this.maxFileSize = maxFileSize; + } + + /** + * Sets the maximum size allowed for uploaded files. Values can use the suffixed "MB" + * or "KB" to indicate a Megabyte or Kilobyte size. + * @see #setMaxFileSize(long) + */ + public void setMaxFileSize(String maxFileSize) { + this.maxFileSize = parseSize(maxFileSize); + } + + /** + * Sets the maximum size allowed for multipart/form-data requests. + * @see #setMaxRequestSize(String) + */ + public void setMaxRequestSize(long maxRequestSize) { + this.maxRequestSize = maxRequestSize; + } + + /** + * Sets the maximum size allowed for multipart/form-data requests. Values can use the + * suffixed "MB" or "KB" to indicate a Megabyte or Kilobyte size. + * @see #setMaxRequestSize(long) + */ + public void setMaxRequestSize(String maxRequestSize) { + this.maxRequestSize = parseSize(maxRequestSize); + } + + /** + * Sets the size threshold after which files will be written to disk. + * @see #setFileSizeThreshold(String) + */ + public void setFileSizeThreshold(int fileSizeThreshold) { + this.fileSizeThreshold = fileSizeThreshold; + } + + /** + * Sets the size threshold after which files will be written to disk. Values can use + * the suffixed "MB" or "KB" to indicate a Megabyte or Kilobyte size. + * @see #setFileSizeThreshold(int) + */ + public void setFileSizeThreshold(String fileSizeThreshold) { + this.fileSizeThreshold = (int) parseSize(fileSizeThreshold); + } + + private long parseSize(String size) { + Assert.hasLength(size, "Size must not be empty"); + size = size.toUpperCase(); + if (size.endsWith("KB")) { + return Long.valueOf(size.substring(0, size.length() - 2)) * 1024; + } + if (size.endsWith("MB")) { + return Long.valueOf(size.substring(0, size.length() - 2)) * 1024 * 1024; + } + return Long.valueOf(size); + } + + /** + * Create a new {@link MultipartConfigElement} instance. + */ + public MultipartConfigElement createMultipartConfig() { + return new MultipartConfigElement(this.location, this.maxFileSize, + this.maxRequestSize, this.fileSizeThreshold); + } + +} diff --git a/spring-boot/src/test/java/org/springframework/boot/context/embedded/MultiPartConfigFactoryTests.java b/spring-boot/src/test/java/org/springframework/boot/context/embedded/MultiPartConfigFactoryTests.java new file mode 100644 index 00000000000..de1e1551771 --- /dev/null +++ b/spring-boot/src/test/java/org/springframework/boot/context/embedded/MultiPartConfigFactoryTests.java @@ -0,0 +1,69 @@ +/* + * Copyright 2012-2013 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.context.embedded; + +import javax.servlet.MultipartConfigElement; + +import org.junit.Test; + +import static org.hamcrest.Matchers.equalTo; +import static org.junit.Assert.assertThat; + +/** + * Tests for {@link MultiPartConfigFactory}. + * + * @author Phillip Webb + */ +public class MultiPartConfigFactoryTests { + + @Test + public void sensibleDefaults() { + MultiPartConfigFactory factory = new MultiPartConfigFactory(); + MultipartConfigElement config = factory.createMultipartConfig(); + assertThat(config.getLocation(), equalTo("")); + assertThat(config.getMaxFileSize(), equalTo(-1L)); + assertThat(config.getMaxRequestSize(), equalTo(-1L)); + assertThat(config.getFileSizeThreshold(), equalTo(0)); + } + + @Test + public void create() throws Exception { + MultiPartConfigFactory factory = new MultiPartConfigFactory(); + factory.setLocation("loc"); + factory.setMaxFileSize(1); + factory.setMaxRequestSize(2); + factory.setFileSizeThreshold(3); + MultipartConfigElement config = factory.createMultipartConfig(); + assertThat(config.getLocation(), equalTo("loc")); + assertThat(config.getMaxFileSize(), equalTo(1L)); + assertThat(config.getMaxRequestSize(), equalTo(2L)); + assertThat(config.getFileSizeThreshold(), equalTo(3)); + } + + @Test + public void createWithStringSizes() throws Exception { + MultiPartConfigFactory factory = new MultiPartConfigFactory(); + factory.setMaxFileSize("1"); + factory.setMaxRequestSize("2kB"); + factory.setFileSizeThreshold("3Mb"); + MultipartConfigElement config = factory.createMultipartConfig(); + assertThat(config.getMaxFileSize(), equalTo(1L)); + assertThat(config.getMaxRequestSize(), equalTo(2 * 1024L)); + assertThat(config.getFileSizeThreshold(), equalTo(3 * 1024 * 1024)); + } + +}