Struts2文件上传 Common-FileUpload

文件上传是许多项目都遇到的需求,Struts2中也带有文件上传功能,但它是利用的java领域的其他俩个常用的文件上传的项目:Common-FileUpload和COS,在了解Struts2之前让我们了解下怎样使用Common-FileUpload来实现文件上传以及文件上传实现过程中应该注意的问题。

      在Common-FileUpload中,它把从客户端提交过来的表单封装成一个个FileItem对象,这也是它实现文件上传功能的核心类。另一个很重要的类就是FileUploadBase,他的功能就是解析请求(request),如进行上传文件大小验证,请求类型验证(文件上传的enctype要设置成multipart/form-data)等。我们经常用到它的子类ServletFileUpload。在FileUploadBase解析request的过程中会将文件保存到内存,如果文件大小大于我们设置的缓存的大小,它将把文件的其他内容保存到一个临时目录,当我们对FileItem对象实现正真上传时会从内存区或临时目录将文件保存到正真的上传目录。而我们要做的就是进行简单的配置,可以用很少的代码就可以实现文件上传,而不用直接与IO流打交道。首先将文件上传过程中应注意的地方了解下:

1.request请求的方法一定要是POST:method="post"

2.request请求的类型一定要是multipart/form-data: enctype="multipart/form-data"

3.在对DiskFileItemFacotry设置过程中repository参数代表文件保存的临时目录,如果不设置,系统将以                           System.getProperty("java.io.tmpdir")代表的目录作为临时目录。

4.DiskFileItemFacotry中的sizeThreshold参数代表保存到内存的大小,如果当个上传文件的大小小于这个值,则这个文件会暂时保存到内存中。如果大于这个值,则多的部分会保存到临时目录中。单位为B。

5.ServletFileUpload中的sizeMax参数是代表上传文件的总大小,单位为B

6.要对FileItem进行上传操作,首先要判断isFormField()为false,因为系统将每个表单项解析成一个FileItem,这其中也包括不是文件上传的表单项。所以要判断是否为文件上传表单项。

下面用Servlet简单的实现文件上传:

upload.jsp

<body>
<form  method="post" id="uploadForm" action="UploadServlet" enctype="multipart/form-data" >
    <table style="border: 1px solid;" align="center">
        <thead>
            <tr>
                <td style="text-align: center" colspan="2">文件上传</td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="user.username"></input></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="text" name="user.password"></input></td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="file" name="file1"/>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="file" name="file2"/>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="file" name="file3"/>
                </td>
            </tr>
            <tr>
                <td><input type="button" value="Login" id="upload"/></td>
                <td><input type="button" value="Cancel" id="cancelUpload"/></td>
            </tr>
        </tbody>
    </table>
</form>

</body>



UploadServlet:

protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        try {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // 设置临时缓存大小,文件大于这个值的部分保存到临时目录
            factory.setSizeThreshold(1024 * 128);
            //设置文件保存临时目录
            factory.setRepository(new File(
                    "C:\\Documents and Settings\\bond\\temp"));
            ServletFileUpload upload = new ServletFileUpload(factory);
            // 设置上传内容大小
            upload.setSizeMax(1024 * 1024*512);

            List<FileItem> fileItems = upload.parseRequest(request);
            for (FileItem fi : fileItems) {
                if (!fi.isFormField()) {
                    fi
                            .write(new File("D:\\bond\\upload", fi
                                    .getName()));
                }
            }
            request.getRequestDispatcher("success.jsp").forward(request,
                    response);
        } catch (Exception e) {
            e.printStackTrace();
            request.getRequestDispatcher("failure.jsp").forward(request,
                    response);
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值