当前位置:首页 > JSP教程 > JSP基础教程

JSP上传文件

在本章中,我们将讨论和学习如何在jsp中的文件上传。 jsp可以与html表单标签一起使用,以允许用户将文件上传到服务器。上传的文件可以是文本文件或二进制文件或图像文件,也可以是任何文档。

为了方便演示,首先打开eclipse创建一个动态web项目:uploadfile ,其目录结构如下所示 -

创建文件上传表单

现在来看看如何创建一个文件上传表单。 以下html代码创建一个上传器表单。 以下是要注意的重点 -

  • 表单中的method属性应设置为post方法,不能使用get方法。
  • 表单中的enctype属性应设置为multipart/form-data。
  • 表单中的action属性应该设置为一个jsp文件,它将处理后端服务器上的文件上传。 以下示例 - 使用uploadhandle.jsp程序处理上传文件。

要上传单个文件,应该在单个<input ... />标签中指定使用type ="file"属性。 要允许多个文件上传,请将name属性包含多个具有不同值的输入标记。浏览器将浏览按钮与每个浏览器相关联。

文件:selectfile.html文件代码如下 -

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>文件上传示例</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <h3>文件上传示例</h3>
        选择要上传的文件: 
        <form action="uploadhandle.jsp" method="post" enctype="multipart/form-data">
            <input type="file" name="file" size="50" /><input
                type="submit" value="提交上传" />
        </form>
    </div>
</body>
</html>

这将显示以下结果。现在可以从本地电脑选择一个文件,并且当用户单击“上传文件”时,表单将随所选文件一起提交 -

注意 - 上面的表单只是虚拟表单,不起作用,要处理上传还需要编写jsp相关处理文件上传的程序。

后端jsp脚本

现在定义一个存储上传文件的位置。可以在程序中对此进行硬编码,也可以使用外部配置(如web.xml中的context-param元素)添加此目录名称,如下所示:

以下是uploadfile.jsp的源代码。这可以一次处理多个文件的上传。 在继续上传文件之前,需要考虑以下几点:

  • 以下示例依懒于fileupload类库; 确保类路径中有最新版本的commons-fileupload.x.x.jar文件(可以从 http://commons.apache.org/fileupload/ 下载)。
  • fileupload类库依懒于commons io;确保类路径中有最新版本的commons-io-x.x.jar文件(可以从 http://commons.apache.org/io/ 下载)。
  • 在测试以下示例时,应该将上传的文件大小小于maxfilesize,否则文件将不会被上传。
  • 这个项目中是将文件上传到项目部署的目录下,但您可配置并创建目录c:temp和c:apache-tomcat8.5.29webappsdata或指定到其位置。

文件:uploadhandle.jsp 的代码实现如下 -

<%@ page language="java" contenttype="text/html; charset=utf-8"
    pageencoding="utf-8"%>
<%@ page import="java.io.*,java.util.*, javax.servlet.*"%>
<%@ page import="javax.servlet.http.*"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.disk.*"%>
<%@ page import="org.apache.commons.fileupload.servlet.*"%>
<%@ page import="org.apache.commons.io.output.*"%>

<%
    file file;
    int maxfilesize = 5000 * 1024;
    int maxmemsize = 5000 * 1024;
    servletcontext context = pagecontext.getservletcontext();
    //string filepath = context.getinitparameter("file-upload");
    string filepath = request.getsession().getservletcontext().getrealpath("");
    //string filepath = request.getcontextpath(); 
    system.out.println("filepath => " + filepath);
    // verify the content type
    string contenttype = request.getcontenttype();

    if (contenttype == null) {
        system.out.println("contenttype => " + contenttype);
        contenttype = "";
    }
    if ((contenttype.indexof("multipart/form-data") >= 0)) {
        diskfileitemfactory factory = new diskfileitemfactory();
        // maximum size that will be stored in memory
        factory.setsizethreshold(maxmemsize);

        // location to save data that is larger than maxmemsize.
        factory.setrepository(new file("c:temp"));

        // create a new file upload handler
        servletfileupload upload = new servletfileupload(factory);

        // maximum file size to be uploaded.
        upload.setsizemax(maxfilesize);

        try {
            // parse the request to get file items.
            list fileitems = upload.parserequest(request);

            // process the uploaded file items
            iterator i = fileitems.iterator();

            out.println("<html>");
            out.println("<head>");
            out.println("<title>jsp file upload</title>");
            out.println("</head>");
            out.println("<body>");

            while (i.hasnext()) {
                fileitem fi = (fileitem) i.next();
                if (!fi.isformfield()) {
                    // get the uploaded file parameters
                    string fieldname = fi.getfieldname();
                    string filename = fi.getname();
                    boolean isinmemory = fi.isinmemory();
                    long sizeinbytes = fi.getsize();

                    // write the file
                    if (filename.lastindexof("") >= 0) {
                        file = new file(filepath + filename.substring(filename.lastindexof("")));
                    } else {
                        file = new file(filepath + filename.substring(filename.lastindexof("") + 1));
                    }
                    fi.write(file);
                    out.println("uploaded filename: " + filepath + filename + "<br>");
                }
            }
            out.println("</body>");
            out.println("</html>");
        } catch (exception ex) {
            system.out.println(ex);
        }
    } else {
        out.println("<html>");
        out.println("<head>");
        out.println("<title>servlet upload</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>no file uploaded</p>");
        out.println("</body>");
        out.println("</html>");
    }
%>

现在尝试使用上面创建的html表单上传文件。部署项目后,打开浏览器访问url: http://localhost:8080/uploadfile/selectfile.html 时将显示以下结果。

如果编写的jsp脚本工作正常,选择的文件应该上传到项目的根目录中。



【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!