上传文件

发表时间:2017-05-15 17:10:54 浏览量( 19 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

这节课讲解一些如何上传文件,这里我们为用户表添加一个头像属性

一、修改数据库表

首先我们要保存用户上传文件的信息,所有要修改数据库,但是我们不是使用数据库保存文件的,文件保存在web服务器的目录下,数据库只是保存文件的路径就可以了,所以我们在tb_user表中添加一个新的属性header,使用varchar格式就可以了,同时修改UserDao的代码,这些代码比较简单,这里就不列出来了。

二、修改页面

这里我们可以使用html的input控件,type类型为file就可以了,同时表单的method方法必须是post,还需要修改enctype属性值为:"multipart/form-data"。这是必须的,adduser.jsp页面代码如下:

    <>
      < action="admin/userServlet?op=add" method= enctype=>
      
        用户名:< name=/>
        </>
         密码:< name= type=/>
            </>
            
                     头像:< name= type=/>
            </>
        < type= value=/>
     </>
  </>

三、在程序中实现上传功能

1、导入第三方包

实现文件上传有很多种方式,这里我们使用第三方commons-fileupload,你可以到网上下载这个包,

这个只有一个核心包,不过它需要依赖commons-io包,所有我们导入这两个包就可以了。

attcontent/f5723570-c2da-4451-b297-5e564bafb708.png

2、打开示例程序,参考示例程序完成代码

java的第三方包支持的技术很多,这也是java流行的原因,而且文档也非常详细,我们可以在这个包的site目录下,找到index.html文件,并打开就可以看到非常详细的文档了,进入文档,点击User Guide就有一个非常详细的入门示例,你可以参考这个示例完成文件的上传操作。

打开servlet修改添加用户的操作,完成代码如下:

  else if (op.equals("add")) {    Map comitem = new HashMap();    String fname = null;    // 处理文件的上传    boolean isMultipart = ServletFileUpload.isMultipartContent(request);    try {        if (isMultipart) {            // Create a factory for disk-based file items            FileItemFactory factory = new DiskFileItemFactory();            // Create a new file upload handler            ServletFileUpload upload = new ServletFileUpload(factory);            // Parse the request            List items = upload.parseRequest(request);            Iterator iter = items.iterator();            while (iter.hasNext()) {                FileItem item = iter.next();                if (item.isFormField()) {                    // 就是一个普通控件                    String name = item.getFieldName();                    String value = item.getString("UTF-8");                    // System.out.println("普通控件" + name + ":" + value);                    comitem.put(name, value);                } else {                    // 是一个文件控件                    String fieldName = item.getFieldName();                    String fileName = item.getName();                    String contentType = item.getContentType();                    boolean isInMemory = item.isInMemory();                    long sizeInBytes = item.getSize();                    // System.out.println("文件控件"+fieldName + ":文件名称" +                    // fileName + ":文件类型"+ contentType + ":文件大小" +                    // sizeInBytes);                    // 要把把文件保存在服务器                    // 如何动态获得服务器的路径                    String strDirPath = request.getSession().getServletContext().getRealPath("/header");                    // 起一个唯一的文件名                    fname = UUID.randomUUID() + fileName.substring(fileName.lastIndexOf("."));                    File uploadedFile = new File(strDirPath + "//"+ fname);                    item.write(uploadedFile);                }            }        }    } catch (Exception e) {    // TODO Auto-generated catch block    e.printStackTrace();    }    User user = new User();    user.setUname(comitem.get("username"));    user.setPass(comitem.get("pass"));    user.setHeader(fname);    int result = userDao.addUser(user);    if (result > 0) {        response.sendRedirect("userServlet");    } else {        response.sendRedirect("error.jsp");    }}

从上面的代码可以看到对于普通控件和文件控件是分开处理的,普通控件的值我们定义了一个Map格式全部保存起来,文件控件我们就保存在服务器的header目录下,这里需要动态的获得服务器的路径使用的方法是:

 String strDirPath = request.getSession().getServletContext().getRealPath("/header");

为了保证上传图片的文件名的唯一性,这里我们使用UUID生成一个唯一性的名称,代码是:

UUID.randomUUID()

这样功能就完成了,你可以尝试上传一下,然后去tomcat服务器的header目录下就可以见到这个文件了。

四、在列表中显示头像

我们要子列表中显示头像,因为数据库中只是保存了文件名称,所有我们需要自己写书路径了,既然是头像,我们当然需要使用img控件显示图片了。代码如下:

    ${status.index+1 }${user.uname }${user.pass } 删除 |
 
    修改