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

架构: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 action="addOrganization"  method="post" enctype="multipart/form-data">

<input type="file" name="file1" />

<input type="file" name="file2" />

<input type="submit" value="提交" />

</form>

我解释一下上述代码。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如何连接数据库这里就不说了,祝武运昌隆!

 

本文到此结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值