Java代码实现文件上传「建议收藏」

Java代码实现文件上传「建议收藏」Java代码实现文件上传在文件上传过程中,文件是以流的形式从浏览器提交到服务端的。一般情况下采用Apache公司的开源文件上传组件common-fileupioad来进行文件的上传。由于common-fileupioad依赖于common-io,所以还要下载common-io这个包。准备工作:下载jar包,建立项目,把包导入lib目录,将lib添加到项目输出目录,配置好Tomcat。我们只…

大家好,又见面了,我是你们的朋友全栈君。

Java代码实现文件上传

在文件上传过程中,文件是以流的形式从浏览器提交到服务端的。一般情况下采用Apache公司的开源文件上传组件common-fileupioad来进行文件的上传。由于common-fileupioad依赖于common-io,所以还要下载common-io这个包。

准备工作:

下载jar包,建立项目,把包导入lib目录,将lib添加到项目输出目录,配置好Tomcat。

我们只编写简单的前端和全部的后端代码,美化前端的任务交给前端管理员

文件上传四个要求:

  1. 为保证服务器安全,上传文件应该放在外界无直接访问的目录下,比如放于WEB-INF目录下。
  2. 为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
  3. 要限制上传文件的最大值。
  4. 可以限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。

中点需要了解的两个类:

Filetem类:

//isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单
//还是一个文件表单,如果是普通表单字段则返回true,否则返回false
boolean isFormField();

//getFieldName方法用于返回表单标签name属性的值。
String getFieldName();
//getString方法用于将FileItem对象中保存的数据流内容以一个字符串返回
String getString();
    
//getName方法用于获得文件上传字段中的文件名。
String getName();

//以流的形式返回上传文件的数据内容。
InputStream getInputStream()

//delete方法用来清空FileItem类对象中存放的主体内容
//如果主体内容被保存在临时文件中,delete方法将删除该临时文件。
void delete();

ServletFileUpload 类:

代码实现

method必须是post,post对上传的数据没有限制,get无法获取大型文件

form表单默认提交纯文本,要上传文件就要更改enctype属性为文件流

  1. 编写上传文件的upload.jsp文件:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>上传</title>
    </head>
    <body>
    <form action="${pageContext.request.contextPath}/hh" enctype="multipart/form-data" method="post">
        上传用户:<input type="text" name="username"><br/>
        上传文件1:<input type="file" name="file1"><br/>
        上传文件2:<input type="file" name="file2"><br/>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    
  2. 编写UploadServlet.java文件:

    1. 判断上传的文件是带文件的表单还是普通的表单。如果是普通文件,直接返回;如果带文件的表单就执行在一个步骤。

    2. 创建一个上传文件的保存路径,为了安全,建议在WEB-INF目录下创建upload目录(WEB-INF目录下的文件,用户不能直接访问)。

    3. 需要创建一个临时路径,假如文件超过预期的大小,就将其放入临时文件中,过段时间自动删除或提醒用户进行后续操作,同样,在WEB-INF下建立tmp文件。由于这个目录不应该由人来创建,所以用系统判断来创建。

    4. 处理上传文件一般用流来获取我们不建议用原生态的文件上传流来获取,建议用之前提到的Apache的上传文件组件来实现获取流。

      1. 创建DiskFileItemFactory对象,处理文件上传路径,或大小限制。(这一步可以抽成方法,解耦)

      2. 由构造器传入创建DiskFileItemFactory对象来创建ServletFileUpload对象。

        1. 设置监听对象,监听文件上传进度(注意参数的传递)。

        2. 封装成一个fileitem类,的到upload对象。

          处理乱码问题,设置单个文件上传的最大值,设置总共能上传文件的大小。

      3. 把前端请求解析,封装成fileitem对象,拿到一个集合,遍历集合。

        1. 注意判断是否是普通表单还是带文件的表单
        2. 并且处理乱码问题
        3. 如果判断后是需要上传的表单,就获取文件地址,判断地址是否合法(是否为空或地址不存在)
        4. 过得文件名字,获得文件后缀名。
        5. 使用UUID来保证文件名字唯一。(UUID:随机生成一个唯一识别的通用码)
        6. 至此处理文件完毕
      4. 编辑处理文件的真实路径(文件存在路径(uploadpath)+/+文件名),给每个文件创建对应的文件。至此存放地址处理完毕

      5. 获得文件上传的流(fileitem.getinputstream),创建一个文件输入流。创建字符缓冲区,并判断文件是否读取完毕。最后按顺序关闭outputstream和inputstream。至此文件传输完毕。

        package com.david.uploadfile;
        
        import org.apache.commons.fileupload.FileItem;
        import org.apache.commons.fileupload.FileUploadBase;
        import org.apache.commons.fileupload.FileUploadException;
        import org.apache.commons.fileupload.ProgressListener;
        import org.apache.commons.fileupload.disk.DiskFileItemFactory;
        import org.apache.commons.fileupload.servlet.ServletFileUpload;
        
        import javax.servlet.http.HttpServletRequest;
        import java.io.*;
        import java.util.List;
        import java.util.UUID;
        
        public class UpLoadServlet extends javax.servlet.http.HttpServlet { 
                 
            protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { 
                 
                doGet(request,response);
            }
        
            protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { 
                 
                try { 
                 
                    if (!ServletFileUpload.isMultipartContent(request)) { 
                 
                        return;
                    }
                    String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
                    File uploadfile = new File(uploadPath);
                    if (!uploadfile.exists()) { 
                 
                        uploadfile.mkdir();
                    }
                    String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp");
                    File file = new File(tmpPath);
                    if (!file.exists()) { 
                 
                        file.mkdir();
                    }
                    DiskFileItemFactory factory = getDiskFileItemFactory(file);
                    ServletFileUpload upload = getServletFileUpload(factory);
                    String msg = uploadParseRequest(upload, request, uploadPath);
                    request.setAttribute("msg", msg);
                    request.getRequestDispatcher("info.jsp").forward(request, response);
                }catch (FileUploadBase.FileUploadIOException e){ 
                 
                    e.printStackTrace();
                } catch (FileUploadException e) { 
                 
                    e.printStackTrace();
                }
            }
        
            private static String uploadParseRequest(ServletFileUpload upload, HttpServletRequest request, String uploadPath) throws FileUploadException, IOException { 
                 
                String msg = "";
                List<FileItem> fileItems = upload.parseRequest(request);
                for (FileItem fileItem : fileItems) { 
                 
                    if (fileItem.isFormField()){ 
                 
                        String name = fileItem.getFieldName();
                        String value = fileItem.getString("UTF-8");
                        System.out.println(name+":"+value);
                    }else { 
                 
                        String uploadFileName = fileItem.getName();
                        System.out.println("上传的文件名"+uploadFileName);
                        if (uploadFileName.trim().equals("")||uploadFileName==null){ 
                 
                            continue;
                        }
                        String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/")+1);
                        String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);
                        System.out.println("文件信息 [件名:"+fileName+"---文件类型"+fileExtName+"]");
                        String uuidPath = UUID.randomUUID().toString();
                        String realPath = uploadPath+"/"+uuidPath;
                        File realPathfile = new File(realPath);
                        if (!realPathfile.exists()){ 
                 
                            realPathfile.mkdir();
                        }
                        InputStream inputStream = fileItem.getInputStream();
                        FileOutputStream fos = new FileOutputStream(realPath+"/"+fileName);
                        byte[] buffer = new byte[1024*1024];
                        int len = 0;
                        while ((len=inputStream.read(buffer))>0){ 
                 
                            fos.write(buffer,0,len);
                        }
                        fos.close();
                        inputStream.close();
                        msg = "文件上传成功!";
                        fileItem.delete();
                    }
                }
                return msg;
            }
        
            private static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) { 
                 
                ServletFileUpload upload = new ServletFileUpload(factory);
                upload.setProgressListener(new ProgressListener() { 
                 
                    @Override
                    public void update(long pBytesRead, long pContentLength, int pItems) { 
                 
                        System.out.println("总大小:" + pContentLength + "已上传:" + pBytesRead);
                    }
                });
                upload.setHeaderEncoding("UTF-8");
                upload.setFileSizeMax(1024*1024*10);
                upload.setSizeMax(1024*1024*10);
                return upload;
            }
        
            private static DiskFileItemFactory getDiskFileItemFactory(File file) { 
                 
                DiskFileItemFactory factory = new DiskFileItemFactory();
                factory.setSizeThreshold(1024*1024);
                factory.setRepository(file);
                return factory;
            }
        }
        

        尽量保证Servlet类中代码干净,将可以封装的代码封装起来,需要时调用

    5. 写一个提示信息的界面关联servlet。

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>Title</title>
      </head>
      <body>
      ${msg}
      </body>
      </html>
      
    6. 配置web.xml,编辑index.jsp首页。

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
          <servlet>
              <servlet-name>UpLoadFileServlet</servlet-name>
              <servlet-class>com.david.uploadfile.UpLoadServlet</servlet-class>
          </servlet>
          <servlet-mapping>
              <servlet-name>UpLoadFileServlet</servlet-name>
              <url-pattern>/hh</url-pattern>
          </servlet-mapping>
      </web-app>
      
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
        <head>
          <title>首页</title>
        </head>
        <body>
        <a href="upload.jsp">点击上传</a>
        </body>
      </html>
      
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146684.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何利用微信做营销?

    如何利用微信做营销?

    2021年8月28日
    47
  • matlab做主成分分析法_matlab主成分分析如何看结果

    matlab做主成分分析法_matlab主成分分析如何看结果.PAGE..主成分分析法主成分分析(principalcomponentsanalysis,PCA)又称:主分量分析,主成分回归分析法目录[HYPERLINK”javascript:toggleToc()”显示]HYPERLINK”/wiki/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90%E6%B3%95″\l”.E4.BB.80.E…

    2022年10月23日
    0
  • pycharm安装教程-pycharm安装详细步骤(Mac版)

    pycharm安装教程-pycharm安装详细步骤(Mac版)上期跟大家讲了怎么安装Python,这期跟大家介绍个很好用的编程工具–pycharm。PyCharm是一种PythonIDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。Pycharm分为专业版(Professional)和社区版(Community),专业版功能非常全,需要购买,可以试用,对比之下社区版功能有限,可以免费使用,并且开源。如果大家只是不需要做特别复杂的项目,下载社区版就足够

    2022年8月25日
    3
  • ArrayList扩容1.5倍

    ArrayList扩容1.5倍先写一个小案例代码packagecom.itheima.demo;importjava.lang.reflect.Field;importjava.util.ArrayList;publicclassArrayListDemo{publicstaticvoidmain(String[]args){ArrayList&lt;I…

    2022年4月28日
    30
  • 如何在pycharm中安装pygame_python安装pycharm的方法

    如何在pycharm中安装pygame_python安装pycharm的方法今天好不容易啃书到项目实践过程,终于可以做一款小游戏了,这对我这个Python编程小白来说,无疑是自己一直想要去实现的。正准备兴致勃勃的准备撸代码时,就开始碰壁了,因为在安装pygame,我按照书中步骤来时,却永远安不上,可能是书的问题也可能是我自己哪部分搞错了,于是去搜了一下百度,虽然有很多办法,但无一都很复杂,写了一大堆,最终在我自我摸索下,终于搞好了,现在分享一下我的下载过程,超级简单:1、首先打开pycharm,再点击Terminal终端,在终端输入:pipinstallpygame即可

    2022年8月29日
    3
  • 6个Python工程师必考的面试题「建议收藏」

    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要给大家介绍6个Python工程师必考的面试题。

    2022年1月18日
    69

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号