基于struts2的文件上传

一,如果要使用struts2来上传文件要遵循一定格式才能成功上传文件
假如我们想要上传一张图片,就要定义一个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来异步请求用户头像的路径名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值