您的位置:首页 > 运维架构 > Apache

java学习——apache commons fileupload实现上传

2015-10-12 16:24 781 查看
在实际工作中,我们总是会使用到上传图片的功能,至于java如何实现图片的上传,我们没必要去自己写一套上传的代码,因为上传的技术已经相当成熟,我们只要从网上找一个例子,调试好,然后集成到自己的项目中就行了,非常方便。那么今天,我就跟大家分享一下我通过apache commons fileupload实现的上传。

一、业务了解

首先,我们要清楚,每个上传的图片都要与数据库中的一条记录对应。因此,也就产生了多种存取方式。

[code]将文件存放在tomcat(或其他)服务器中,然后将其名字改为该记录的主键名。


[code]将文件存放在tomcat(或其他)服务器中,然后将其名字存到相应的记录中。


[code]将文件存放在数据库中(不常用),通常我们只将系统自带的一些图片存在数据库中。


此次上传图片采用的方法二,只是将上传的图片名称保存到数据库中,而将上传的图片保存至tomcat服务器中,保存的目录是在代码中自动创建的。

二、开发环境搭建

需要下载的jar包,下载完成后,将其导入到java项目中。如图

commons-fileupload-1.1.1.jar

commons-io-1.2.jar




三、上传的实现

让我们看看java是怎么实现上传的。这里我们采用的是java学习——架构的设计是项目的核心中的model2模式,也就是java中的mvc模式,这里我们将上传的实现现在Servlet中,其继承自httpServlet类。

1、item_upload.jsp页面

[code]<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ page import="bjpowernode.drp.basedata.domain.*" %>  
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
        + request.getServerName() + ":" + request.getServerPort()
        + path + "/";
    Item item = (Item)request.getAttribute("item"); 
%>
<html>
    <head>
        <base href="<%=basePath %>">
        <title>物料维护</title>
        <link rel="stylesheet" href="style/drp.css">
        <script src="script/client_validate.js"></script>
        <script language="javascript">

</script>
    </head>

    <body class="body1">
        <!-- 注意这部分必须为post提交,而且必须要有enctype="multipart/form-data" --!>
        <form name="itemForm" target="_self" id="itemForm" method="post" action="servlet/item/FileUploadServlet" enctype="multipart/form-data">
            <input type="hidden" name="itemNo" value="<%=item.getItemNo() %>">
            <div align="center">
                <table width="95%" border="0" cellspacing="2" cellpadding="2">
                    <tr>
                        <td>
                             
                        </td>
                    </tr>
                </table>
                <table width="95%" border="0" cellspacing="0" cellpadding="0"
                    height="8">
                    <tr>
                        <td width="522" class="p1" height="2" nowrap>
                            <img src="images/mark_arrow_03.gif" width="14" height="14">
                             
                            <b>基础数据管理>>物料维护>>上传物料图片</b>
                        </td>
                    </tr>
                </table>
                <hr width="97%" align="center" size=0>
                <table width="95%" border="0" cellpadding="0" cellspacing="0">
                    <tr>
                        <td height="29">
                            <div align="right">
                                物料代码: 
                            </div>
                        </td>
                        <td>
                            <%=item.getItemNo() %>
                        </td>
                    </tr>
                    <tr>
                        <td height="26">
                            <div align="right">
                                物料名称: 
                            </div>
                        </td>
                        <td>
                            <%=item.getItemName() %>
                        </td>
                    </tr>
                    <tr>
                        <td height="26">
                            <div align="right">
                                物料规格: 
                            </div>
                        </td>
                        <td>
                            <%=item.getSpec() %>
                        </td>
                    </tr>
                    <tr>
                        <td height="26">
                            <div align="right">
                                物料型号: 
                            </div>
                        </td>
                        <td>
                            <%=item.getPattern() %>
                        </td>
                    </tr>
                    <tr>
                        <td height="26">
                            <div align="right">
                                类别: 
                            </div>
                        </td>
                        <td>
                            <%=item.getItemCategory().getName() %>
                        </td>
                    </tr>
                    <tr>
                        <td height="26">
                            <div align="right">
                                计量单位: 
                            </div>
                        </td>
                        <td>
                            <%=item.getItemUnit().getName() %>
                        </td>
                    </tr>
                    <tr>
                        <td height="74">
                            <div align="right">
                                图片: 
                            </div>
                        </td>
                        <td>
                            <img src="upload/<%=item.getFileName() %>" width="85" height="49">
                        </td>
                    </tr>
                    <tr>
                        <td width="22%" height="29">
                            <div align="right">
                                <font color="#FF0000">*</font>选择图片: 
                            </div>
                        </td>
                        <td width="78%">
                            <input name="fileName" type="file" class="text1" size="40" maxlength="40">
                        </td>
                    </tr>
                </table>
                <hr width="97%" align="center" size=0>
                <div align="center">
                    <input name="btn_upload" class="button1" type="submit"
                        id="btn_upload" value="上传">
                        
                    <input name="btnBack" class="button1" type="button" id="btnBack"
                        value="返回" onClick="history.go(-1)">
                </div>
            </div>
        </form>
    </body>
</html>


2、处理上传文件的FileUploadServlet类

[code]public class FileUploadServlet extends HttpServlet {

    private ItemManager itemManager;

    private File uploadPath;

    private File tempPath; // 用于存放临时文件的目录

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
            //使用Apache文件上传组件处理文件上传步骤:
            //1、创建一个DiskFileItemFactory工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // 文件大于此临界值时,采用临时文件
            factory.setSizeThreshold(4096);
            // 采用临时文件时,的临时文件目录
            factory.setRepository(tempPath);
            //创建一个文件上传解析器
            ServletFileUpload upload = new ServletFileUpload(factory);
            //设置上传文件大小的上限,-1表示无上限 
            upload.setSizeMax(1000000 * 20);
            try {
                //上传文件,并解析出所有的表单字段,包括普通字段和文件字段
                List fileItems = upload.parseRequest(req);
                //用来存放物料代码
                String itemNo = "";
                //循环将所有的文件上传
                for (Iterator iter = fileItems.iterator(); iter.hasNext();) {
                    FileItem item = (FileItem) iter.next();
                    //是普通的表单输入域
                    if(item.isFormField()) {
                        //得到物料代码
                        if ("itemNo".equals(item.getFieldName())) {
                            itemNo = item.getString();
                        }
                    }
                    //是否为input="type"输入域
                    if (!item.isFormField()) {
                        String fileName = item.getName();   //得到文件名
                        long size = item.getSize();         //得到文件大小
                        if ((fileName == null || fileName.equals("")) && size == 0) {
                            continue;
                        }
                        //获取文件名称,截取字符串 如:C:\WINDOWS\Debug\PASSWD.LOG
                        fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
                        //保存文件,其实就是把缓存里的数据写到目标路径下
                        item.write(new File(uploadPath, fileName));
                        //调用itemManager对象将物料代码和其图片名称存入数据库
                        itemManager.uploadItemImage(itemNo,fileName);
                    }
                }
                //重定向
                res.sendRedirect(req.getContextPath() + "/servlet/item/SearchItemServlet");
            } catch (Exception e) {
                e.printStackTrace();
                throw new ApplicationException("上传失败!");
            }
        }

    public void init() throws ServletException {
        uploadPath = new File(getServletContext().getRealPath("upload"));
        System.out.println("uploadPath=====" + uploadPath);
        //如果目录不存在
        if (!uploadPath.exists()) {
            //创建目录
            uploadPath.mkdir();
        }

        //临时目录
        tempPath = new File(getServletContext().getRealPath("temp"));
        if (!tempPath.exists()) {
            tempPath.mkdir();
        }

        itemManager=new ItemManagerImpl();
    }
}


四、总结

此代码也是从网上找的,然后改了改。我觉得这就够了,我们需要站在巨人的肩膀上,利用现有的资源,达到自己的目的。当然,我们会在以后的学习过程中给大家介绍java实现下载等,请大家继续关注。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: