使用servlet实现文件上传功能

版权声明:@渔闻520 https://blog.csdn.net/weixin_41060905/article/details/82717717

先从http://jakarta.apache.org/commons/fileupload下载到Apache文件上传组件的二进制发行包,文件名为Commons——fileupload-1.3.zip,下载解压后,将jar包拷贝到web—INF下lib文件夹中。

类
标题

类

这里还要导入一个包:

commons-io.jar 这个包可以在Apache网站上下载到。该包的作用是可以提供解析,即对parseRequest()方法的支持。

这里注意:

必须使用post方法,因为get请求的数据长度有限。

name属性必须有。

下面上代码:

servlet代码:

package net.book.util;

import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

/**
 * @Author: JiangYi
 * @Date: 2018/9/16 10:04
 * @Description:
 */
@WebServlet(name = "FileUploadServlet",urlPatterns = "/fileUploadServlet")
public class FileUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");//设置返回给浏览器的编码,中文不会乱码
        PrintWriter out = response.getWriter();

        //设置保存上传文件的目录
        String uploadDir="e:/upfile";
        out.println("上传文件存储目录!"+uploadDir);
        File fUploadDir = new File(uploadDir);
        if(!fUploadDir.exists()){
            if(!fUploadDir.mkdir()){
                out.println("无法创建存储目录"+uploadDir);
                return;
            }
        }
        if(!DiskFileUpload.isMultipartContent(request)){
            out.println("只能处理mutipart/form-data类型的数据");
            return;
        }
        DiskFileUpload diskFileUpload = new DiskFileUpload();
        diskFileUpload.setSizeMax(1024*1024*200);
        diskFileUpload.setSizeThreshold(1024*1024);
        diskFileUpload.setHeaderEncoding("utf-8");
        List <FileItem> fileItems;
        try {
            fileItems=diskFileUpload.parseRequest(request);
        } catch (FileUploadException e) {
            out.println("解析数据时出现如下问题:");
            e.printStackTrace(out);
            return;
        }
       // out.println("fffffffffffffffff");
        //下面通过迭代器逐个将集合中的文件取出,保存到服务器上
        Iterator it = fileItems.iterator();
        while (it.hasNext()){
            FileItem item = (FileItem) it.next();//由迭代器取出文件项
            if(!item.isFormField()){//忽略那些不属于文件域的表单信息
                String pathSrc = item.getName();
                if(pathSrc.trim().equals(" ")) continue;
                int start = pathSrc.lastIndexOf("\\");//确定最后\的位置以此来获取不含路劲的文件名
                String fileName = pathSrc.substring(start + 1);
                File pathDest = new File(uploadDir, fileName);
                try {
                    item.write(pathDest);
                } catch (Exception e) {
                    out.println("存储文件时遇到如下的问题:");
                    e.printStackTrace(out);
                }
                finally {
                    item.delete();
                }

            }
        }
        response.sendRedirect("bookstory/fileUpload_list.jsp");


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }}

提交文件的代码:

<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2018/9/16
  Time: 10:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body bgcolor="#ffffff" text="black" marginleft="0" margintop="40" marginwidth="0" marginheight="0">
<center>
    <h1>文件上传</h1>
    <form name="uploadform" method="post" action="/fileUploadServlet" enctype="multipart/form-data">
        <table border="3" width="450" cellpadding="4" cellspacing="2">
            <tr>
                <td colspan="2">
                    文件1:<input type="file" name="file1" size="40">
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    文件2:<input type="file" name="file2" size="40">
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    文件3:<input type="file" name="file3" size="40">
                </td>
            </tr>
        </table><br><br>
        <table>
            <tr>
                <td align="center">
                    <input type="submit" name="submit" value="开始上传"/>
                </td>
            </tr>
        </table>
    </form>
</center>

</body>
</html>

查看效果的代码:

<%@ page import="java.io.File" %><%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2018/9/16
  Time: 10:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件目录</title>
</head>
<body>
<font size="4" color="red">已上传文件的目录列表</font>
<br>
<font size="5" color="blue">
    <%
        String path="e:/upfile";
        File file = new File(path);
        File[] filelist = file.listFiles();
        out.println("服务器上传文件的保存路径:"+path+"<br><br>");
        for (int i=0;i<filelist.length;i++){
            out.println((i+1)+":"+filelist[i].getName()+"&nbsp;&nbsp;<br>");
        }
    %>
</font>
</body>
</html>

区别普通表单字段和文件表单字段(用 pulbic boolean isFormField()方法)

普通表单字段指的是<input type="text">等这些

而文件表单字段,指的是<input type="file">

另外,保存在文件夹下,是会抛出拒绝访问的异常。

猜你喜欢

转载自blog.csdn.net/weixin_41060905/article/details/82717717