Java web实现文件上传
平时使用的表单提交时,他的enctype是使用的”application/x-www-form-urlencoded”这种格式上传到你的servlet。
在上传文件时,也就是说type==file并且需要提交时,就需要把他变成二进制流的这种编码格式。需要设置成“multipart/form-data”。但是,使用这种格式也会有问题
用这种格式可以用来上传文件,但是其他普通的表单元素还是需要用urlencoded这种编码格式。
这种时候可以写两个表单提交,给file类型的表单元素单独提交
想要俩一起提交,可以给每个表单元素一个ID值,使用JS 的方式提交
使用js提交,分别取出表单元素的value值,然后获取表单这个对象本身,定好它的action,自己把其获取的表单元素给拼进url
在手动调用其submit方法提交这个表单。Submit提交的是二进制流数据
(Js取file类型表单元素的value值取到得是文件名字)
在servlet里面先获取所有提交上来的表单元素,把他们封装为一个对象先保存进数据库,在进行文件上传的处理
文件提交进servlet的时候,文件会存在一个临时目录里边,我们要做的就是把它从临时目录里移动到web项目的指定位置。此时可以使用jspsmartupload这个jar包。
有一个叫做SmartUoload的工具类,先把他实例化出来,在调用其配置方法。获取Servlet的配置环境和请求响应参数传给他。实现对其的初始化
初始化完成后,使用它的upload方法,这时候就可以另存文件了。
再从里面getFiles出来,得到一个Files的集合(此Files是jspsmartupload里面的Files,不是IO包里的)
遍历这个文件集合得到一个个File,获取要保存进的文件夹的绝对路径。在获取上传文件的文件名,通过文件名得到后缀名。通过字符串拼接给他一个新名字。
在使用saveAs另存为一下。里面传入之前获取的:绝对路径+”/”+新名字。将文件保存进指定目录
最后需要把存在于服务器的文件给同步到工作空间,这样就不会在重新部署项目的时候出现文件丢失的问题。所以在做完之后,最好是去服务器的根目录拷贝一下。
Product product=new Product(); try { BeanUtils.populate(product, req.getParameterMap()); //返回新添加商品的主键值 int pid=dao.addProduct(product); SmartUpload su=new SmartUpload(); //初始化上传api su.initialize(getServletConfig(), req, resp); su.upload();//另存文件 //获取上传文件的集合 Files files=su.getFiles(); //遍历集合 for(int i=0;i<files.getCount();i++) { //获取单个文件 File file=files.getFile(i); //获取images文件夹在服务器的绝对路径 String path=req.getServletContext().getRealPath("images"); //获取上传文件的文件名 String name=file.getFileName(); //获取上传文件的后缀名 String suffix=name.substring(name.lastIndexOf(".")); String newName=pid+"_"+i+suffix; //将文件保存到指定目录 file.saveAs(path+"/"+newName); product.setPid(pid); product.setPicture(newName); }