日记 - 网站中的上传文件动态化

阅读更多

架构: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如何连接数据库这里就不说了,祝武运昌隆!

 

本文到此结束

  • 日记 - 网站中的上传文件动态化_第1张图片
  • 大小: 14.4 KB
  • 日记 - 网站中的上传文件动态化_第2张图片
  • 大小: 21.5 KB
  • 日记 - 网站中的上传文件动态化_第3张图片
  • 大小: 22.7 KB
  • 查看图片附件

你可能感兴趣的:(fileupload,url,spring集成)