JSP 文件上传


JSP 文件上传

在 web 应用程序中,文件上传是一项极其常见的功能。JSP 技术使我们能够轻松地实现文件上传,本文将详细介绍如何使用 JSP 完成文件上传。

浏览器上传文件的方式

我们早已习惯使用“浏览”按钮上传文件。实际上,在 HTML 等标记语言中使用 <input type="file"> 创建一个文件上传窗口。当我们提交表单时,文件数据将通过 HTTP 协议以多部分表格形式发送,服务器就能知道这是一个文件上传请求。

JSP 实现文件上传

要在 JSP 页面中实现文件上传,我们需要在表单中添加 enctype 属性设置:

<form action="file-upload.jsp" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile">
    <input type="submit" value="上传文件">
</form>

这样我们就可以将一个文件上传到服务器了。 JSP 接收到上传的文件时,可以通过 getParameter() 方法来获取表单项的值,例如:

String fileName = request.getParameter("myfile");

但是,在文件上传时,不能使用 getParameter() 方法来获取上传文件的内容。相反,我们需要使用以下步骤来接收文件:

  1. 创建 DiskFileItemFactory 的实例,它将被用来创建 ServletFileUpload 类的对象。在创建 DiskFileItemFactory 对象时,我们需要提供 FileItemFactory 接口的实现类。

  2. 创建 ServletFileUpload 的实例。它是一个提供了文件上传功能的类。

  3. 解析上传的请求并获得所有表单项的列表。

  4. 实例化 FileItem 对象,并检查每个表单项,如果表单项是一个文件,则把它写到磁盘上,并把它的信息存储到数据库中。

  5. 在 JSP 页面中显示成功上传的信息。

以下是一个完整的文件上传示例代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
  
<%@ page import="org.apache.commons.fileupload.*"%>  
<%@ page import="org.apache.commons.fileupload.disk.*"%>  
<%@ page import="org.apache.commons.fileupload.servlet.*"%>  
  
<%@ page import="java.util.*"%>  
<%@ page import="java.io.*"%>  
  
<%@ page import="java.sql.*"%>  
  
<%  
    String fileName = "";  
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);  
    if (isMultipart) {  
        //实例化DiskFileItemFactory对象,可以设置缓存参数  
        //默认的缓存路径是tomcat的temp文件夹下面的temp文件夹  
        DiskFileItemFactory factory = new DiskFileItemFactory();  
        // 创建一个 ServletFileUpload 对象  
        ServletFileUpload upload = new ServletFileUpload(factory);  
        //解决上传文件名的中文乱码问题  
        upload.setHeaderEncoding("utf-8");  
        //开始解析请求信息  
        List items = upload.parseRequest(request);  
        Iterator itr = items.iterator();  
        while (itr.hasNext()) {  
            FileItem item = (FileItem) itr.next();  
            //如果表单是文件上传控件  
            if (item.isFormField() == false) {  
                //获取文件名  
                fileName = item.getName();  
                //这里可以自己写,比如加上时间戳什么的  
                if (fileName != null) {  
                    //获取上传文件的大小  
                    int sizeInByte = (int) item.getSize();  
                    // 获取文件的扩展名  
                    String ext = fileName.substring(fileName.lastIndexOf(".") + 1);  
                    //获取Web应用的服务端部署物理路径(也可以直接使用硬盘路径)  
                    String serverPath = application.getRealPath("/") + "upload";  
                    //如果路径不存在,新建路径  
                    File folder = new File(serverPath);  
                    if (!folder.exists()) {  
                        if (folder.mkdir()) {  
                            System.out.println("New directory has been created!");  
                        } else {  
                            System.out.println("Failed to create new directory!");  
                        }  
                    } else {  
                        System.out.println("Directory already exists!");  
                    }  
                    //以日期创建新的文件名  
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");  
                    String newFileName = sdf.format(new java.util.Date()) + "." + ext;  
                    //在上传的路径里面出新文件  
                    File uploadedFile = new File(serverPath, newFileName);  
                    try {  
                        item.write(uploadedFile);  
                        //将上传戳入数据库  
                        Class.forName("com.mysql.jdbc.Driver");  
                        String url = "jdbc:mysql://localhost:3306/test?user=root&password=root";  
                        Connection con = DriverManager.getConnection(url);  
                        Statement stm = con.createStatement();  
                        String sql = "insert into test.upload_log values('" + sdf.format(new java.util.Date()) + "',"  
                                + sizeInByte + ",'" + fileName + "','" + uploadedFile.getAbsolutePath() + "')";  
                        System.out.println(sql);  
                        stm.execute(sql);  
                        response.getWriter().println("已将文件上传至服务器的 " + uploadedFile.getAbsolutePath());  
                    } catch (Exception e) {  
                        response.getWriter().println("上传文件出现错误!");  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
    } else {  
        response.getWriter().println("没有文件被上传!");  
    }  
%>  

总结

在 JSP 页面中使用文件上传功能确实很容易,只需添加一个表单控件和设置一些属性即可。然而,实现文件上传并不是一件简单的事情。对于大文件上传、速度慢或中途中断等问题,开发人员需要高度警惕。在部署上传文件的 Web 应用程序时,需要特别注意缓存路径是否正确、访问权限是否配置正确等问题。