JavaWeb实现简单上传文件功能

 更新时间:2022年06月22日 12:10:47   作者:归酒  
这篇文章主要为大家详细介绍了JavaWeb实现简单上传文件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了JavaWeb实现上传文件功能的具体代码,供大家参考,具体内容如下

基本思想:网站服务器的内部除了有Web应用,还有文件系统,客户端向网站上传文件就是将文件以流的形式传输给了服务器,如图所示:

注意事项:

1、为保证服务器的安全,上传的文件路径应放在外界不能直接访问的目录下,比如WEB-INF目录下。
2、因为服务器的文件系统大小有限,上传的文件大小必须要有限制。
3、为防止因为文件名重复而导致文件覆盖,应当给上传的文件夹生成唯一的标识,比如时间戳、UUID或者md5加密。
4、可以限制上传文件的类型,在收到文件的时候,判断文件后缀是否合法。

在JavaWeb中,一般我们使用ServletFileUpload类来处理上传的文件数据,它使用parseRequest方法将表单的每一个输入项封装成一个FileItem对象,并以list的形式返回,处理数据比较简短,方便。

下面是一个上传文件的小demo,编辑器是IDEA,项目类型是Maven Webapp。

package com.xiaojing.servlet;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;

public class FileUploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //判断表单是普通表单,还是上传文件表单
        if(!ServletFileUpload.isMultipartContent(req)){
            return;
        }
        //创建上传文件的路径,一般放在/WEB-INF下,比较安全
        String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
        File uploadFile = new File(uploadPath);
        if(!uploadFile.exists()){
            uploadFile.mkdir();
        }
        //如果上传的文件大小超过了限制,那么会将这个文件放在临时文件夹,过段时间提醒用户删除或者转为永久
        String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
        File tempFile = new File(tempPath);
        if(!tempFile.exists()){
            tempFile.mkdir();
        }

        //1、创建DiskFileItemFactory对象
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //2、获取ServletFileUpload对象
        ServletFileUpload upload = new ServletFileUpload();
        upload.setFileItemFactory(factory);
        //3、处理上传文件
            //将前端请求封装成Fileitem对象,每一个表单输入项都是一个Fileitem对象
        try {
            List<FileItem> items = upload.parseRequest(req);
            for (FileItem item: items) {
                if(item.isFormField()){ //如果是普通的表单
                    //getFieldName()是input的name属性,getString()是input的value属性
                    String fieldName = item.getFieldName();
                    String value = item.getString("UTF-8");
                    System.out.println(fieldName + ":" +value);
                }else{  //上传文件的表单
                    //---------------处理文件------------------//
                    String uploadFileName = item.getName();
                    System.out.println("上传的文件名:"+uploadFileName);
                    if(uploadFileName == null || uploadFileName.trim().equals("")){
                        continue;
                    }
                    //获取fileName文件名,uploadFileName一般是url/文件路径/文件
                    String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("\\")+1);
                    //获取文件后缀
                    String fileExt = uploadFileName.substring(uploadFileName.lastIndexOf(".")+1);
                    System.out.println("文件信息:"+fileName);

                    //---------------处理地址-----------------//
                    //使用UUID唯一标识存放文件夹
                    String uuidPath = UUID.randomUUID().toString();
                    //获取真实的文件夹地址
                    String realPath = uploadPath + "/" + uuidPath;
                    File realFile = new File(realPath);
                    if(!realFile.exists()){
                        realFile.mkdir();
                    }

                    //---------------处理文件流-----------------//
                    //获取文件上传的流
                    InputStream inputStream = item.getInputStream();
                    //创建一个文件输出流
                    FileOutputStream outputStream = new FileOutputStream(realFile + "/" + fileName);
                    //创建一个缓冲区
                    byte[] buffer = new byte[1024 * 1024];
                    int len = 0;
                    while((len = inputStream.read(buffer)) > 0){ //每次读写1M
                        outputStream.write(buffer,0,len);
                    }
                    outputStream.close();
                    inputStream.close();

                    String msg = "文件上传成功";
                    System.out.println("文件上传成功");
                    //清除临时文件
                    item.delete();
                    //转发
                    req.setAttribute("msg",msg);
                    req.getRequestDispatcher("index.jsp").forward(req,resp);

                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java实战之图书管理系统的实现

    Java实战之图书管理系统的实现

    这篇文章主要介绍了如何利用Java语言编写一个图书管理系统,文中采用的技术有Springboot、SpringMVC、MyBatis、ThymeLeaf 等,需要的可以参考一下
    2022-03-03
  • java.sql.SQLException:com.mysql.cj.jdbc.Driver报错问题解决

    java.sql.SQLException:com.mysql.cj.jdbc.Driver报错问题解决

    这篇文章主要给大家介绍了关于java.sql.SQLException:com.mysql.cj.jdbc.Driver报错问题解决的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • 详解如何在Java中实现懒加载

    详解如何在Java中实现懒加载

    懒加载是一种常见的优化技术,它可以延迟对象的创建或初始化,直到对象第一次被使用时才进行。在本文中,我们将介绍如何使用 Java 中的 Supplier 接口和双重检查锁定模式来实现懒加载,并保证只初始化一次,希望对大家有所帮助
    2023-03-03
  • 关于Controller层和Service层的类报错问题及解决方案

    关于Controller层和Service层的类报错问题及解决方案

    这篇文章主要介绍了关于Controller层和Service层的类报错问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Spring中@Lazy注解的使用示例教程

    Spring中@Lazy注解的使用示例教程

    Spring在应用程序上下文启动时去创建所有的单例bean对象, 而@Lazy注解可以延迟加载bean对象,即在使用时才去初始化,这篇文章主要介绍了Spring中@Lazy注解的使用,需要的朋友可以参考下
    2023-06-06
  • Dubbo3的Spring适配原理与初始化流程源码解析

    Dubbo3的Spring适配原理与初始化流程源码解析

    这篇文章主要为大家介绍了Dubbo3的Spring适配原理与初始化流程源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • IDEA中WebService生成Java代码并调用外部接口实现代码

    IDEA中WebService生成Java代码并调用外部接口实现代码

    这篇文章主要介绍了IDEA中WebService生成Java代码并调用外部接口实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • 基于bufferedreader的read()与readline()读取出错原因及解决

    基于bufferedreader的read()与readline()读取出错原因及解决

    这篇文章主要介绍了bufferedreader的read()与readline()读取出错原因及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java获取项目路径方式System.getProperty(“user.dir“)

    Java获取项目路径方式System.getProperty(“user.dir“)

    这篇文章主要介绍了Java获取项目路径方式System.getProperty(“user.dir“),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • JAVA对象clone方法代码实例解析

    JAVA对象clone方法代码实例解析

    这篇文章主要介绍了JAVA对象clone方法代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论