SpringMVC 文件上传
客户端文件上传要求:
1,表单提交方式为post提交
2,提供文件上传组件,<input type="file">
3,表单的entype属于必须属于multipart/form-data,如果没有这个属性值的话,文件内容是提交不到服务器的。
服务器端要求:
1,获取到客户端上传的文件
2,准备一个目录存储客户端上传的文件
3,将上传的文件写入到目录中
SpringMVC封装了commons-fileupload,所以我们还需要添加commons-fileupload的依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
在Spring.xml文件中配置文件解析器
<!--配置文件解析器,解析上传过来的文件-->
<!--必须通过文件解析器的解析才能将文件转换为MultipartFile对象-->
<!--必须设置id属性,springMVC是根据id获取,且id必须设置为multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上传文件最大内存为5MB-->
<property name="maxUploadSize" value="5242880"></property>
</bean>
简单案例
客户端
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/file/upload" method="post" enctype="multipart/form-data">
<input type="file" name="logo">
<input type="submit" value="提交上传">
</form>
</body>
</html>
@RestController
@RequestMapping("file")
public class FlieUploadController {
/**
* 1,获取客户端上传的文件的信息
* 2,获取客户端上传的文件,存放到文件夹中,通过输出流存储到文件夹中
*
* 注意:!!!参数中MultipartFile的名字必须与客户端一致
*/
@PostMapping("upload")
public void upload( MultipartFile logo, HttpServletRequest httpServletRequest){
//1,获取项目在编译后,存储文件夹的真实路径
//优化目录
Calendar instance = Calendar.getInstance();
//日期做目录
String dirDate = instance.get(Calendar.YEAR)+"/"+instance.get(Calendar.MONTH)+"/"+instance.get(Calendar.DATE);
String realPath = httpServletRequest.getSession().getServletContext().getRealPath("file/"+dirDate);
File file = new File(realPath);
//判断file文件夹是否真实存在
if(!file.exists()){
//不存在
//创建文件夹
file.mkdirs();
}
//获取客户端上传的文件名
String originalFilename = logo.getOriginalFilename();
//获取后缀
int i = originalFilename.lastIndexOf(".");
String suffix = originalFilename.substring(i);
//文件名用uuid代替文件名
String filename = UUID.randomUUID()+suffix;
try {
//将客户端的文件写入到文件夹中
logo.transferTo(new File(file,filename));
} catch (IOException e) {
e.printStackTrace();
}
}
}
FastDFS+Nginx搭建Java分布式文件系统-爱码网
简单的远程上传文件的案例
用tomcat做文件服务器,首先需要配置web.xml
tomcat默认不是允许其他服务器往自身写入数据的,需要在tomcat配置文件conf/web.xml的servlet标签下加上如下代码
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
然后上传文件的服务端添加以下依赖
<!--跨服务器上传的依赖-->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.18.1</version>
</dependency>
然后案例代码如下:
@PostMapping("upload2")
public void upload2(MultipartFile logo){
//获取客户端上传的文件名
String originalFilename = logo.getOriginalFilename();
//获取后缀
int i = originalFilename.lastIndexOf(".");
String suffix = originalFilename.substring(i);
//文件名用uuid代替文件名
String filename = UUID.randomUUID()+suffix;
//使用跨服务文件上传方式,将客户端文件上传到文件服务器中
Client client = Client.create();
//连接文件服务器路径
WebResource resource = client.resource("http://localhost:8080/file/"+filename);
try {
resource.put(logo.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}