架构:springMVC+maven
环境:win7,jdk1.6
工具:tomcat
阅读本文需要一定的编程基础,例如本文中所用到的springMVC等基础知识。
如何将网站中的上传文件做到动态化
在springMVC下,如何上传文件?上传的文件应该放在哪里?程序如何引用上传文件?实现上面两个问题就可实现上传文件的动态化了?众所周知(谁用谁知道,不用不知道。用了还是不知道的人别来烦我)。
首先是解决上传功能
spring下的org.springfranmework:spring-web:3.2.8(3.2.8是我用的版本,我在网上搜到的甚至早在2.5版本就支持了)这个包提供的文件上传的支持,就是下面这个类,配置这个类,并且配置上传文件的大小上限
但是,这里有一个问题,上图的这个CommonsMultipartResolver类它依赖于fileupload-1.2.1包中的一个名叫FileItemFactory的接口。而且只支持fileupload-1.2.1,高了就不支持。
好的,如果你都配置好了,接下来该怎么用呢?我们先从jsp来看看,毕竟文件是从那里开始上传的。
我解释一下上述代码。form提交方式,如果你要上传文件,那么提交方式必须是post而且要添加enctype="multipart/form-data"这个属性,想知道为什么就百度去。
然后,你的input标签里的type属性给个“file”这样就表示这是个上传控件。
至于我这里出现name="file1"和name="file2"。这里是扩展一下,如何上传多个文件,springMVC里又如何接收(我这里的上传功能是很皮毛的,我还没研究高端的,以后学习了会给大家分享的)。
那么这样jsp的代码就算写好了,接下来看看程序内部如何接收。
public String addOrganization( @RequestParam("file1") MultipartFile file1, @RequestParam("file2") MultipartFile file2, @ModelAttribute OrganizationForm organizationForm, Model model, HttpServletRequest request)
我来解释一下,@RequestParam("file1") MultipartFile file1, @RequestParam("file2") MultipartFile file2 用注解的方式给出这两个参数就可以接收上传的文件了。那么后面的@ModelAttribute OrganizationForm organizationForm 这个东西算什么呢?这是我实际项目中用到的一个类,也就是说form表单可以掺杂其他的对象的提交。只要你自己理清楚就可以,至少我是一点点试出来的。只要会配置了其他大家可以慢慢玩,慢慢试,或许会做出更好的上传方式。
现在得到上传过来的文件了,那么如何写入呢?
if (!file1.isEmpty()) {
byte[] bytes = file1.getBytes();
FileOutputStream fos = new FileOutputStream(uploadPath +"/"+ file1.getOriginalFilename());//这里给个URL,这个url是文件写入的地址
fos.write(bytes); //写入文件
fos.close(); //记得要关闭
}
只要这么点代码就可以将上传的文件写入了。
接下来是重点。url必须是一个相对路径,因为程序会部署到不同环境,到时地址是不一样的,所以需要一个相对路径,能随着环境不同而自动变化的路径。我们需要request去获得tomcat下的相对路径,以下是代码
public String getTheTomcatImageURL(HttpServletRequest request) {
String logoPathDir = "/static/upload/logo/";
String logoRealPathDir = request.getSession().getServletContext()
.getRealPath(logoPathDir);
new File(logoRealPathDir).mkdirs();
return logoRealPathDir;
}
用这个方法来获得相对的路径,放到写入地址里。
springMVC会拦截请求,用绝对路径是不行的,想访问静态文件必须通过下面这段配置来解析你的相对文件路径。这就是不能使用绝对路径的原因,只能使用mapping地址
这注定了写入地址和mapping地址不相同。mapping地址最后要存入数据库做动态化,下面是实际代码,让大家看看我是怎么实现的
String uploadPath = this.getTheTomcatImageURL(request);
String IconPath = "upload/logo/";
organizationForm.setZhIcon(IconPath+file1.getOriginalFilename());
if (!file1.isEmpty()) {
byte[] bytes = file1.getBytes();
FileOutputStream fos = new FileOutputStream(uploadPath +"/"+ file1.getOriginalFilename());
fos.write(bytes); //写入文件
fos.close();
}
由于不同的只有地址,文件名必须相同,这样才能指向同一个文件。
这样动态化也完成了,springMVC如何连接数据库这里就不说了,祝武运昌隆!
本文到此结束