零、这篇关键点
- 详细介绍SpringBoot对文件上传的自动配置。
- 介绍MultipartFile接口。
- 详细介绍SpringBoot Thymeleaf文件上传demo的融合。
- 详细介绍对文件属性,文件名长度等分辨方式。
一、SpringBoot对文档解决有关自动配置
自动配置是SpringBoot为大家提供的便捷之一,开发人员可以在没有作一切配置的情形下,应用SpringBoot提供的默认设定,如解决文档必须的MultipartResolver。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })
@ConditionalOnProperty(prefix = \"spring.servlet.multipart\", name = \"enabled\", matchIfMissing = true)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(MultipartProperties.class)
public class MultipartAutoConfiguration {
private final MultipartProperties multipartProperties;
public MultipartAutoConfiguration(MultipartProperties multipartProperties) {
this.multipartProperties = multipartProperties;
}
@Bean
@ConditionalOnMissingBean({ MultipartConfigElement.class, CommonsMultipartResolver.class })
public MultipartConfigElement multipartConfigElement() {
return this.multipartProperties.createMultipartConfig();
}
@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
@ConditionalOnMissingBean(MultipartResolver.class)
public StandardServletMultipartResolver multipartResolver() {
StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
return multipartResolver;
}
}
- Spring3.1以后适用StandardServletMultipartResolver,且默认应用StandardServletMultipartResolver,它的优势取决于:应用Servlet所提供的作用适用,不用依靠一切其它的新项目。
- 要想自动配置起效,必须配置spring.servlet.multipart.enabled=true,自然这一配置默认便是true。
- 有关的配置设定在MultipartProperties中,在其中字段名便是相应的特性设定,經典字段名有:enabled:是不是打开文件上传自动配置,默认开启。location:文件上传的临时性文件目录。maxFileSize:较大图片大小,以字符为企业,默认为1M。maxRequestSize:全部要求的最高容积,默认为10M。fileSizeThreshold:图片大小做到该阀值,将载入临时性文件目录,默认为0,即全部材料都是会立即载入硬盘临时文件夹中。resolveLazily:是不是可塑性解决要求,默认为false。
- 大家还可以自定解决的关键点,必须完成MultipartResolver接口。
二、解决文件上传MultipartFile接口
SpringBoot为大家提供了MultipartFile强劲接口,使我们可以获得文件上传的详细资料,如初始文件夹名称,內容种类这些,接口內容如下所示:
public interface MultipartFile extends InputStreamSource {
String getName(); //获得主要参数名
@Nullable
String getOriginalFilename();//初始的文件夹名称
@Nullable
String getContentType();//內容种类
boolean isEmpty();
long getSize(); //尺寸
byte[] getBytes() throws IOException;// 获得字节数二维数组
InputStream getInputStream() throws IOException;//以流方法实现载入
default Resource getResource() {
return new MultipartFileResource(this);
}
// 将提交的文档载入系统文件
void transferTo(File var1) throws IOException, IllegalStateException;
// 载入特定path
default void transferTo(Path dest) throws IOException, IllegalStateException {
FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));
}
}
三、SpringBoot Thymeleaf融合demo
1、撰写控制板
/**
* 文件上传
*
* @author Summerday
*/
@Controller
public class FileUploadController {
private static final String UPLOADED_FOLDER = System.getProperty(\"user.dir\");
@GetMapping(\"/\")
public String index() {
return \"file\";
}
@PostMapping(\"/upload\")
public String singleFileUpload(@RequestParam(\"file\") MultipartFile file,
RedirectAttributes redirectAttributes) throws IOException {
if (file.isEmpty()) {
redirectAttributes.addFlashAttribute(\"msg\", \"文档为空,请选择你的文件上传\");
return \"redirect:uploadStatus\";
}
saveFile(file);
redirectAttributes.addFlashAttribute(\"msg\", \"文件上传\" file.getOriginalFilename() \"取得成功\");
redirectAttributes.addFlashAttribute(\"url\", \"/upload/\" file.getOriginalFilename());
return \"redirect:uploadStatus\";
}
private void saveFile(MultipartFile file) throws IOException {
Path path = Paths.get(UPLOADED_FOLDER \"/\" file.getOriginalFilename());
file.transferTo(path);
}
@GetMapping(\"/uploadStatus\")
public String uploadStatus() {
return \"uploadStatus\";
}
}
2、撰写网页页面file.html
<html xmlns:th=\"http://www.thymeleaf.org\">
<!--suppress ALL-->
<html lang=\"en\">
<head>
<meta charset=\"UTF-8\">
<title>文件上传页面</title>
</head>
<body>
<div>
<form method=\"POST\" enctype=\"multipart/form-data\" action=\"/upload\">
<table>
<tr><td><input type=\"file\" name=\"file\" /></td></tr>
<tr><td></td><td><input type=\"submit\" value=\"提交\" /></td></tr>
</table>
</form>
</div>
</body>
</html>
3、撰写网页页面uploadStatus.html
<!--suppress ALL-->
<html xmlns:th=\"http://www.thymeleaf.org\">
<html lang=\"en\">
<head>
<meta charset=\"UTF-8\">
<title>上传文件页面</title>
</head>
<body>
<div th:if=\"${msg}\">
<h2 th:text=\"${msg}\"/>
</div>
<div >
<img src=\"\" th:src=\"${url}\" alt=\"\">
</div>
</body>
</html>
4、撰写配备
server.port=8081
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
5、配置虚似途径投射
这一步是十分关键的,大家将文件传送到网络服务器处时,大家必须将人们的要求途径和云服务器上的途径开展相匹配,要不然极有可能上传文件取得成功,但浏览不成功:
@Configuration
public class MvcConfig implements WebMvcConfigurer {
private static final String UPLOADED_FOLDER = System.getProperty(\"user.dir\");
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(\"/upload/**\")
.addResourceLocations(\"file:///\" UPLOADED_FOLDER \"/\");
}
}
对应关系必须自已去界定,假如浏览不成功,可以尝试打印出下列途径,看一下是不是缺少了途径分隔符。
留意:如果addResourceHandler不必写出解决/**,那样会阻拦掉别的的要求
6、检测网页页面
实行mvn spring-boot:run,运行程序流程,浏览http://localhost:8081/,选择文件,点一下提交按键,大家的新项目文件目录下产生了mongo.jpg,而且网页页面也取得成功表明:
四、SpringBoot的Restful设计风格,回到url
/**
* 上传文件
*
* @author Summerday
*/
@RestController
public class FileUploadRestController {
/**
* 文件名长度
*/
private static final int DEFAULT_FILE_NAME_LENGTH = 100;
/**
* 容许的文件属性
*/
private static final String[] ALLOWED_EXTENSIONS = {
\"jpg\", \"img\", \"png\", \"gif\"
};
/**
* 新项目途径
*/
private static final String UPLOADED_FOLDER = System.getProperty(\"user.dir\");
@PostMapping(\"/restUpload\")
public Map<String,Object> singleFileUpload(@RequestParam(\"file\") MultipartFile file) throws Exception {
if (file.isEmpty()) {
throw new Exception(\"文档为空!\");
}
String filename = upload(file);
String url = \"/upload/\" filename;
Map<String,Object> map = new HashMap<>(2);
map.put(\"msg\",\"提交取得成功\");
map.put(\"url\",url);
return map;
}
/**
* 提交方式
*/
private String upload(MultipartFile file) throws Exception {
int len = file.getOriginalFilename().length();
if (len > DEFAULT_FILE_NAME_LENGTH) {
throw new Exception(\"文件夹名称超过限定!\");
}
String extension = getExtension(file);
if(!isValidExtension(extension)){
throw new Exception(\"格式文件有误\");
}
// 自定文件夹名称
String filename = getPathName(file);
// 获得file目标
File desc = getFile(filename);
// 载入file
file.transferTo(desc);
return filename;
}
/**
* 获得file目标
*/
private File getFile(String filename) throws IOException {
File file = new File(UPLOADED_FOLDER \"/\" filename);
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
if(!file.exists()){
file.createNewFile();
}
return file;
}
/**
* 认证文件属性是不是恰当
*/
private boolean isValidExtension(String extension) {
for (String allowedExtension : ALLOWED_EXTENSIONS) {
if(extension.equalsIgnoreCase(allowedExtension)){
return true;
}
}
return false;
}
/**
* 这里自定文件夹名称,uuid extension
*/
private String getPathName(MultipartFile file) {
String extension = getExtension(file);
return UUID.randomUUID().toString() \".\" extension;
}
/**
* 获得后缀名
*/
private String getExtension(MultipartFile file) {
String originalFilename = file.getOriginalFilename();
return originalFilename.substring(originalFilename.lastIndexOf(\'.\') 1);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。