基于struts2的文件上传
2015-11-29 19:32
393 查看
一,如果要使用struts2来上传文件要遵循一定格式才能成功上传文件
假如我们想要上传一张图片,就要定义一个VO类
其中上面的myFile对应的是页面的这个标签的name的名称,当然这个是可以任意改的,但是java代码中的两个String类型的变量是根据这个来定义的。其模板是
要使用struts2来上传文件还需要在struts.xml配置文件定义一个文件上传大小的配置。
这一行的配置就是限制文件上传的大小。
记得在form标签的属性要添加 enctype=”multipart/form-data”来确保匿名上载文件的正确编码。
表单中enctype=”multipart/form-data”的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.
接下来就是最为重要的代码片段,也就是实现文件上传到服务器端的代码
其实上面的代码实现的步骤可以总结一下几点
1,创建文件上传的路径,对文件的名称进行转换,使用UUID算法,使得文件名在服务器端不会重复,不导致文件名重复覆盖文件。其中有一个需要注意的地方就是斜杠,这个要符合服务器端的规范,所以要进行格式的转换。
2,获取客户端上传的二进制数据,然后输出到服务器端保存到文件系统。
3,将文件的路径名字保存到数据库中,最后再将路径名字保存到session中,这是可选的,根据业务需求来选择。
如果是要上传用户的头像到服务器端,然后在立即回显到页面中来,就需要将路径名字保存到session中,通过ajax来异步请求用户头像的路径名。
假如我们想要上传一张图片,就要定义一个VO类
private File myFile; //上传的文件 private String myFileContentType; //上传的文件类型 private String myFileFileName; //上传的文件名称
其中上面的myFile对应的是页面的这个标签的name的名称,当然这个是可以任意改的,但是java代码中的两个String类型的变量是根据这个来定义的。其模板是
private File xxx; private String xxxContentType; private String xxxFileName;
要使用struts2来上传文件还需要在struts.xml配置文件定义一个文件上传大小的配置。
<!-- 上传文件大小的限制 --> <constant name="struts.multipart.maxSize" value="2073741824"/>
这一行的配置就是限制文件上传的大小。
记得在form标签的属性要添加 enctype=”multipart/form-data”来确保匿名上载文件的正确编码。
表单中enctype=”multipart/form-data”的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.
接下来就是最为重要的代码片段,也就是实现文件上传到服务器端的代码
public String execute(){ HttpSession session = request.getSession(); System.out.println("execute photo upload!"); //获得username User user = (User)session.getAttribute("globle_user"); String username = user.getUserName(); //设置文件保存目录 String photoPath = ServletActionContext.getServletContext().getRealPath("/user/photo/" + username); File filePhotoPath = new File(photoPath); //创建文件夹 if(!filePhotoPath.isDirectory()) { filePhotoPath.mkdirs(); } //解决中文文件名问题 String extension = FilenameUtils.getExtension(this.valueObject.getMyFileFileName()); String filename = UUID.randomUUID().toString() + "."+ extension; //设置目标文件 File tofile = new File(photoPath,filename); //获取上传的头像图片的存放的完整路径 String imageUrl = photoPath+File.separator+filename; String relateImageUrl= "user"+File.separator+"photo"+File.separator+username+File.separator+filename; System.out.println("图片的相对的路径:"+relateImageUrl); //替换斜杠,从而符合服务器的规范 imageUrl = imageUrl.replace('\\', '/'); relateImageUrl = relateImageUrl.replace('\\', '/'); //将头像图片的路径保存到user用户表中 /*userService.addHeadImageUrl(relateImageUrl,user.getId());*/ user.setHeadImage(relateImageUrl); userService.addHeadImageUrl(relateImageUrl, user.getId()); //定义输出流和输入流 InputStream is = null; OutputStream os = null; try { //创建一个输入流 is = new BufferedInputStream( new FileInputStream(this.valueObject.getMyFile())); //使用输出流来包装目标文件 os = new BufferedOutputStream(new FileOutputStream(tofile)); byte[] buffer = new byte[1024]; int length = 0; while((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); } //当图片上传到本地文件夹之后,将用户头像图片添加到session中 session.setAttribute("imageUrl", relateImageUrl); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(os!=null){ try { //关闭输出流 os.close(); } catch (IOException e) { e.printStackTrace(); }finally{ if(is != null){ try { //关闭输入流 is.close(); } catch (IOException e) { e.printStackTrace(); } } } }//关闭流的操作 } return null; }
其实上面的代码实现的步骤可以总结一下几点
1,创建文件上传的路径,对文件的名称进行转换,使用UUID算法,使得文件名在服务器端不会重复,不导致文件名重复覆盖文件。其中有一个需要注意的地方就是斜杠,这个要符合服务器端的规范,所以要进行格式的转换。
2,获取客户端上传的二进制数据,然后输出到服务器端保存到文件系统。
3,将文件的路径名字保存到数据库中,最后再将路径名字保存到session中,这是可选的,根据业务需求来选择。
如果是要上传用户的头像到服务器端,然后在立即回显到页面中来,就需要将路径名字保存到session中,通过ajax来异步请求用户头像的路径名。
相关文章推荐
- spring MVC 学习(四)---拦截器,视图解析器
- java web中几个概念的区别
- Java语法基础思维图
- ajax异步提交 springMVC处理
- Java集合中ArrayList的实现原理
- 构造函数
- 学习Struts2_0600_ActionWildcard
- Eclipse提示乱码问题的解决方法
- Struts2学习——(三)升级action的配置方式
- 【Eclipse】Win 7 下 Eclipse 图标无法锁定到任务栏的解决方法
- eclipse mars中的adt配置
- maven学习三:eclipse 创建maven普通项目和web项目
- Java面向对象知识点总结
- 基于xml的Spring多数据源配置和使用
- JAVA面向对象(一)
- Java语法基础
- 初试springWebMVC
- 如何在Java中使用注释
- eclipse
- Spring Data jpa 中@Column 注解解释