Struts2和Servlet在上传文件时的区别

Struts2会解析封装Requset


Servlet获取的Requset形式为 org.apache.catalina.connector.RequestFacade

Struts2重新封装过的Request的形式为 org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper


原本Servlet的保存文件的代码:

private boolean saveFileToFolder(HttpServletRequest request, TechWms techWms) throws Exception {
        try {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);

            List items = upload.parseRequest(request);
            String fileName = "";
            String filePath = "";
            Iterator iter2 = items.iterator();
            while (iter2.hasNext()) {
                FileItem item = (FileItem) iter2.next();
                if (item.isFormField()) {
                } else {
                    fileName = item.getName();
                    FileManager fileManager = new FileManager();
                    String photopath = "/resources/uploads/THUMBNAIL/";

                    String tpath = request.getSession().getServletContext().getRealPath(photopath);
                    String random = IdTool.getId();
                    File uploadedFile = fileManager.createDirectory(tpath);
                    filePath = tpath + "\\" + random+fileName;
                    uploadedFile = new File(filePath);
                    item.write(uploadedFile);

                    techWms.setThumbnail("THUMBNAIL/" +fileName);
                    this.getTechWmsServices().save(techWms);
                }
            }
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
    }

经过封装的Request在 upload.parseRequest(request) 这一步的时候会返回空值。值的一提的是,这个步骤在Struts2进行封装的时候已经执行过了。


其实Struts2对于Request的封装有简化文件上传的功能在里面,仔细看封装过的Request便可知:


网上有很多方法,去除封装之类的。个人认为在不是受到很大局限的情况下,变更为Struts2下的文件上传写法是最理想的,代码如下,两段代码完成的相同功能:

    public boolean savefile(TechWms techWms){
        MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) getRequest();
        File file = wrapper.getFiles("Filedata")[0];
        String fileName = wrapper.getParameter("Filename");

        try {
            String savePath = ServletActionContext.getServletContext().getRealPath("resources/uploads/THUMBNAIL/");
            InputStream in = new FileInputStream(file);
            File uploadFile = new File(savePath, fileName);
            OutputStream out = new FileOutputStream(uploadFile);
            byte[] buffer = new byte[1024 * 1024];
            int length;
            while ((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
            }
            in.close();
            out.close();

            techWms.setThumbnail("THUMBNAIL/" +fileName);
            this.getTechWmsServices().save(techWms);
            return true;
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
            return false;
        } catch (IOException ex) {
            ex.printStackTrace();
            return false;
        }
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值