在开始之前我们先说下multipart的配置 直接在application.properties进行配置即可 我写的很清楚了就不说了 这些都是默认值
#单个上传文件最大
spring.servlet.multipart.max-file-size=1MB
#上传文件总大小最大
spring.servlet.multipart.max-request-size=10MB
#(零界值)超过零界值就忘硬盘写 不超过写内存
spring.servlet.multipart.file-size-threshold=0
#文件很大的话 需要一个临时文件夹保存文件 然后再写入硬盘 这就是那个路径设置
spring.servlet.multipart.location=
我们以上传img为例 我们使用@RestController注解哦
开始之前我们先复习几个servletRequest 的方法
获取web应用上下文 request.getServletContext()
获取项目的绝对路径 getRealPath(String)
一般来说不支持单独使用getRealPath 我们会使用 request.getServletContext().getRealPath(String)获取web应用的相对路径的绝对路径
我们给我们的文件进行分类 使用时间进行分类会更好一点
那么我们创建一个现行时间
SimpleDateFormat sdf=new SimpleDateFormat("/yyyy-MM-dd");
我们设置绝对路径为realPath 在这儿我们可以提一个知识点 这是se基础知识
String lujing=d:\a\\b
使用file.mkdirs创建的话 没有a不能创建b
使用file.mkdirs创建的话 没有a我们也可以创建b 那么a也会被创建
String format = sdf.format(new Date());
String realPath = request.getServletContext().getRealPath("/img") + format;
//文件夹
File folder = new File(realPath);
//如果文件夹不存在那么我们就创建一下
if(!folder.exists()){
folder.mkdirs();
}
路径弄完了 我们来设置文件名
我们为了防止名称重复使用uuid进行创建 那么我们设置newName 下面代码就是se中String的基础知识了
//获取传来的文件名字
String originalFilename = file.getOriginalFilename();
String newName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
下面我们存下文件 然后我们吧路径返回
try {
//存文件
file.transferTo(new File(folder,newName));
String url=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/img"+format+newName;
return url;
} catch (IOException e) {
e.printStackTrace();
}
return "error";
我们解析下下面代码
request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/img"+format+newName;
request.getScheme() 获取http协议 正常来说返回的是 http
request.getServerName() 获取我们的访问ip 本地项目一般是localhost
request.getServerPort() 获取我们的端口号
最后呢我们可以在html中写文件上传控件
<html lang="en">
<head>
<meta charset="UTF-8">
<title>fileupload</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="提交">
</form>
</body>
</html>
基本上都是基础 我们说一下enctype=“multipart/form-data”
这个的意思就是说表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。
需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。
application/x-www-form-urlencoded不是不能上传文件,是只能上传文本格式的文件,multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。
扩展资料(以下资料来源于网络):
一、关于HTML 标签的 enctype 属性
application/x-www-form-urlencoded:在发送前编码所有字符(默认)
multipart/form-data: 不对字符编码,或在使用包含文件上传控件的表单时,必须使用该值。
text/plain:空格转换为 “+” 加号,但不对特殊字符编码。
二、enctype:规定了form表单在发送到服务器时候编码方式,有如下的三个值。
1、application/x-www-form-urlencoded。默认的编码方式。但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得 效率低下。
2、multipart/form-data 。 指定传输数据为二进制类型,比如图片、mp3、文件。
3、text/plain。纯7a64e78988e69d8331333366306562文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。
下面放下我们全部的java代码和html代码
package com.file;
@RestController
public class FilruploadController {
SimpleDateFormat sdf=new SimpleDateFormat("/yyyy-MM-dd/");
@PostMapping("/upload")
public String file(MultipartFile file, HttpServletRequest request){
String format = sdf.format(new Date());
String realPath = request.getServletContext().getRealPath("/img") + format;
//创建文件夹路径
File folder = new File(realPath);
//如果文件夹已经不存在那么我们就创建一下
if(!folder.exists()){
folder.mkdirs();
}
String originalFilename = file.getOriginalFilename();
String newName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
try {
file.transferTo(new File(folder,newName));
String url=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/img"+format+newName;
return url;
} catch (IOException e) {
e.printStackTrace();
}
return "error";
}
}
<html lang="en">
<head>
<meta charset="UTF-8">
<title>fileupload</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="提交">
</form>
</body>
</html>