以下有三种可以上传的位置:
1.一些文件存储量很小的工程,上传文件放置在工程本身的目录下,但是 随着文件越来越大,工程启动和运行也会变慢,所以一般不采用。
2.是将图片上传到一个Web应用工程所在容器(Tomcat)位于的服务器中,单独开辟一个盘符或文件夹用于存储上传的文件,这种做法让上传的文件与工程本身分离,工程的打包和启动效率不受任何影响。但如果出现海量图片,web应用工程所在的服务器的效率会降低。
3.现在一般的互联网应用,都会为自己的文件上传单独架设一个文件服务器。
在测试程序中,我们选择第二种。
在项目的webContent下新建一个upload文件夹,用于存方法上传到服务器的文件
1. 单个文件上传
(1)文件上传页面
<form action="testFileUpload" method="post" enctype="multipart/form-data">
File:<input type="file" name="file"/>
<br>
Desc:<input type="text" name="desc">
<input type="submit" value="Upload">
</form>
(2)springmvc.xml
Spring MVC 上下文中默认没有装配 MultipartResovler,因此默认情况下不能处理文件的上传工作,如果想使用 Spring 的文件上传功能,需现在上下文中配置 MultipartResolver
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<property name="maxUploadSize" value="10485760"></property>
</bean>
(3)Controller
@Controller
public class UploadController {
@RequestMapping("/testFileUpload")
public String testFileUpload(@RequestParam("desc") String desc, @RequestParam("file") MultipartFile uploadFile,
HttpSession session) {
System.out.println("desc: " + desc);
System.out.println("uploadFile: " + uploadFile);
ServletContext context = session.getServletContext();
String realPath = context.getRealPath("/upload");// 获取该文件保存在服务器的真实路径
String filename = uploadFile.getOriginalFilename();// 获取上传文件名
File targetfile = new File(realPath + File.separator + filename);//
System.out.println(targetfile);
try {
// uploadFile.transferTo(targetfile);可以替代下面try块的所有代码
// 读取上传的文件
InputStream in = uploadFile.getInputStream();
//指定文件上传的地址
FileOutputStream fos = new FileOutputStream(targetfile);
int len;
byte[] by = new byte[1024];
while ((len = in.read(by)) != -1) {
fos.write(by, 0, len);
}
in.close();
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "forward:/success.jsp";
}
}
文件上传成功
2.多个文件上传
只需在上面单个文件上传的代码,稍作修改即可。
(1)上传页面增加一个input标签
<form action="testFileUpload" method="post" enctype="multipart/form-data">
File1:<input type="file" name="file"/>
File2:<input type="file" name="file"/>
<br>
Desc:<input type="text" name="desc">
<br>
<input type="submit" value="Upload">
</form>
(2)Controller定义一个数组接受上传的文件,再加一个for循环进行遍历上传文件
@Controller
public class UploadController {
@RequestMapping("/testFileUpload")
public String testFileUpload(@RequestParam("desc") String desc, @RequestParam("file") MultipartFile [] uploadFiles,
HttpSession session) {
System.out.println("desc: " + desc);
ServletContext context = session.getServletContext();
String realPath = context.getRealPath("/upload");// 获取该文件保存在服务器的真实路径
InputStream in =null;
FileOutputStream fos=null;
for(MultipartFile multipartFile:uploadFiles){
String filename = multipartFile.getOriginalFilename();// 获取上传文件名
File targetfile = new File(realPath + File.separator + filename);//获取文件描述
System.out.println(targetfile);
try {
multipartFile.transferTo(targetfile);//可以替代下面try块的所有代码
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "forward:/success.jsp";
}
}
多文件上传成功