在做java web项目时候,大多数情况下有上传文件或者是图片的功能需求,这里介绍的主要是java后台的集中写法,至于判断是否是哪种问价类型或者是是否是图片,前后端都可以,我的做法是前端的上传插件功能很强大,一般就在前端判断了,后台java代码只是辅助的判断就可以了。以下的几个例子也是网上来看到的,自己敲了一遍,有一些收货。
前台代码:
<form name="form1" action="${pageContext.request.contextPath}/fileUpload/mulpart" method="post" enctype="multipart/form-data">
<input type="file" name="file"> <input type="submit" value="提交" />
</form>
1.文件留的上传方式(java基础就应该会这些了)
后台代码:
@RequestMapping("/mulpart")
public String fileUpload(@RequestParam("file") CommonsMultipartFile file,ModelMap model) throws IOException{
try {
OutputStream oStream = new FileOutputStream("D:/file/"+new Date().getTime()+ file.getOriginalFilename());
InputStream iStream = file.getInputStream();
int temp;
while((temp=iStream.read())!=(-1)){
oStream.write(temp);
}
oStream.flush();
oStream.close();
iStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
String fileName = file.getOriginalFilename();
model.addAttribute("fileName", fileName);
return "success";
}
这里返回success,是返回的个一成功页面,带着参数的fileName
succes.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<html>
<head>
<title>success</title>
</head>
<body>
文件名 :<b> ${fileName} </b> - 上传成功!
</body>
</html>
2.multipart提供的file.transferTo方法上传文件
@RequestMapping("/mulpart")
public String fileUpload1(@RequestParam("file") CommonsMultipartFile file,ModelMap modelMap){
String path = "D:/file/"+new Date().getTime()+file.getOriginalFilename();
File file2 = new File(path);
try {
file.transferTo(file2);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
modelMap.addAttribute("fileName", file.getOriginalFilename());
return "success";
}
直接采用multipart提供的file.transferTo()的方法,将文件直接上传到存放的地址。
3.利用spring的上传方式
(1)pom文件添加上传文件的依赖包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
(2)spring的配置文件中配置上传文件的
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8" />
<!-- 文件大小最大值 -->
<property name="maxUploadSize" value="10485760000" />
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="40960" />
</bean>
(3)java代码:
@RequestMapping("/mulpart")
public String fileUpload2(HttpServletRequest request) throws IllegalStateException, IOException{
//创建解析器
CommonsMultipartResolver cResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//检测form中是否有enctype="multipart/form-data"
if (cResolver.isMultipart(request)) {
//将request变成多部分request
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
//获取所有的文件名
Iterator iterator = multipartRequest.getFileNames();
while (iterator.hasNext()) {
MultipartFile file = multipartRequest.getFile(iterator.next().toString());
//System.out.println(iterator.next().toString());
if (file!=null) {
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
String path = "D:/file/"+new Date().getTime()+uuid;
file.transferTo(new File(path));
}
}
}
return null;
}
这里一开始的文件明,采用的iterator.next();运行报错,这是因为这个方法在便利的时候,循环主体内只能出现的一次,所以报错。在项目开发中遇到过的上传图片的功能需求,要是上传的图片非常多,这时就会产生图片名的重复,所以采用uuid的方法来保存图片名,这要就不会出现重复的图片名。然后把用uuid生成图片名保存在数据库中。