Java实现文件上传

文件上传在Web和桌面端开发中常见,JavaWeb可无组件或用组件实现。本文重点介绍使用commons-fileUpload组件实现文件上传,阐述其依赖、主要类及常用方法,还给出详细代码示例,包括jsp页面和Servlet类代码,并提及运行注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不管是Web开发,还是桌面端开发,文件上传这一功能都是常见的,在网站中几乎是必备的功能。在javaWeb中可以使用无组件实现文件上传,也可以使用组件实现文件上传。

组件实现文件的上传可以使用commons-fileUpload或jspsmartupload组件来实现文件的上传。

commons-fileUpload的使用

commons-fileUpload上传组件是apache的一个开源项目,使用这个组件不会出现中文乱码,而使用commons-fileUpload组件依赖commons-io包。ServletFileUpload类是该组件处理文件上传的主要类。

ServletFileUpload类常用方法如下

方法名

描述

public Long getFileSizeMax(Long fileSizeMax)

获取FileItem对象文件大小的最大值.

public void setFileSize(Long fileSizeMax)

设置FileItem对象文件大小的最大值

piblic FileItemIteratorgetItemIterator(HttpServlet Request request)

从请求中获取文件的迭代器

public boolean isMultipartContent(HttpServletRequest request)

返回boolean值,用于判断请求是否为上传文件的请求,主要是判断form表单提交请求类型是否为multipart/form-data

 

其中上面的setFileSizeMax(Long fileSizeMax)和getFileSizeMax()的FileItem对象为parseRequest()方法获取的List集合中的元素

commons-fileUpload使用的代码示例

首先先把需要的两个jar包导进项目中,如下

 

创建两个jsp页面,一个用于文件的上传,一个用于显示文件是否上传成功。

file.jsp(用于上传文件)关键代码如下:

相比以往表单不同的是要设置表单提交请求类型为multipart/form-data

 

<form method="post" action='<c:url value="/FileServlet"></c:url>' enctype="multipart/form-data">

<p>上传文件(注意:文件大小不要超过2MB)</p>

<br>

<input type="file" name="file" size="50"/><br>

文件描述<br>

<input type="submit" value="上传"  size="30"/>

</form>

result.jsp(用于显示文件上传结果)关键代码如下:

在这里简单输出信息

<%=request.getAttribute("message") %>

FileServlet代码(文件上传请求的Servlet类)

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String message = null;

        request.setCharacterEncoding("UTF-8");

        File file = new File(path);

        if(!file.exists()) {//判断文件是否存在,不存在就创建

            file.mkdirs();

        }

        try {

            //判断获取的是否是文件

            if(ServletFileUpload.isMultipartContent(request)) {

               //实例DiskFileItemFactory

                DiskFileItemFactory disk = new DiskFileItemFactory();

                disk.setSizeThreshold(20*1024);//设置内存可存字节数

                disk.setRepository(disk.getRepository());//设置临时文件目录

                ServletFileUpload fupload = new ServletFileUpload(disk);

                int maxSize = 2*1024*1024;

                List list = fupload.parseRequest(request);//获取上传列表

                Iterator it = list.iterator();//创建列表的迭代器

                while(it.hasNext()) {

                   FileItem f = (FileItem) it.next();

                   if(!f.isFormField()) {

                       String filePath = f.getName();//获取文件全路径名

                       String fileName="";

                       int startIndex =filePath.lastIndexOf("\\");

                       if(startIndex!=-1) {

                              //对文件全路径进行截取

                           fileName=filePath.substring(startIndex+1);

                           }

                                   else {

                               fileName=filePath;

                           }

                           if(f.getSize()>maxSize) {

                               message ="文件过大,不能超过2MB";

                               break;

                           }    if(fileName==null||fileName.equals("")&&(f.getSize()==0)) {

                           message="文件不能为空,大小不能为0";

                           break;

                       }

                           //这里为了演示方便,将上传的文件输出到D盘下

                           File saveFile = new File("D:/is",fileName);

                           f.write(saveFile); //写入数据

                           message="文件上传成功";

                   }

                }

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

        request.setAttribute("message", message); //保存信息到request域中

        request.getRequestDispatcher("/jsp/result.jsp").forward(request, response);

    }

运行结果

要注意的是使用commons-fileUpload组件进行表单处理时,因为将表单的enctype属性设置为multipart/form-data,所以在Servlet里使用request对象获取参数是无法获取的,需要使用ServletFileUpload类进行处理。

File.jsp关键代码(上传文件)

<center>

  <%

  String time;

  Date date = new Date();

  time = String.format("%tF", date);

 %>

<form method="post" action='<c:url value="/FileServlet"></c:url>' enctype="multipart/form-data">

<h1>上传文件(注意:文件大小不要超过2MB)</h1>

<br>

选择上传文件

<input type="file" name="file" size="30"/><br><br>

备注

<input type="text" name="fileinfo" size="30"/><br><br>

上传时间

<input id="div1" type="text" value="<%=time %>" name="time" size="30" /><br><br>

<input  type="submit"  size="20" value="提交"/>

</form>

</center>

result.jsp代码 (显示结果,显示获取到的参数)

<body>

    <%=request.getAttribute("message") %>

   文件上传时间: <%=request.getAttribute("time") %>

  文件备注: <%=request.getAttribute("remark") %>

  </body>

servlet代码:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String message = null;//信息

        String remark= null;//文件备注

        String time = null;//上传时间

        request.setCharacterEncoding("UTF-8");

        String path = "D:/is";//定义上传文件的地址

        try {

            //判断从request传过来的是否是文件

            if(ServletFileUpload.isMultipartContent(request)) {

                DiskFileItemFactory dfi = new DiskFileItemFactory();

                dfi.setSizeThreshold(20*1024);//设置内存的可存字节数

                dfi.setRepository(dfi.getRepository());//设置临时文件目录

                ServletFileUpload sf = new ServletFileUpload(dfi);

                int maxsize = 2*1024*1024;

                List list = sf.parseRequest(request);//获取上传列表

                Iterator it = list.iterator();//创建上传列标的迭代器

                while(it.hasNext()) {

                   FileItem fi = (FileItem) it.next();//遍历上传列表

                   if(!fi.isFormField()) {

                       String filePath = fi.getName();//获取文件全路径名

                       String fileName="";

                       int startIndex=filePath.lastIndexOf("\\");

                       if(startIndex!=-1) {

                                //截取文件名

                           fileName=filePath.substring(startIndex+1);

                       }else {

                           fileName=filePath;

                       }

                       if(fi.getSize()>maxsize) {

                           message="文件过大";

                           break;}

                       String fileSize = new Long(fi.getSize()).toString();

    if((fileName==null)||(fileName.equals(""))&&(fileSize.equals("0"))){

                           message="文件不能为空和大小不能为0";

                           break; }

                       File saveFile = new File(path,fileName); //创建File

                       fi.write(saveFile);//向文件写入数据

                       message="上传成功";

                   }

                   else {

                String formName = fi.getFieldName();//获取表单元素名

                String context = fi.getString("utf-8");//获取表单信息,注意编码

                       if(formName.equals("fileinfo")){

                           remark=context; //获取到参数值赋给成员变量

                       }else if(formName.equals("time")) {

                           time=context;

                       }}}

            }

        } catch (Exception e) {

        }

        request.setAttribute("time", time); //将获取到的信息保存到request域中

        request.setAttribute("remark", remark);

        request.setAttribute("message", message);

        request.getRequestDispatcher("/jsp/result.jsp").forward(request, response);}

运行输出

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值