1.准备工作:

准备jar包:

java可以上传html文件吗 java如何上传文件_上传文件

 处理文件上传的jar包

下载地址:FileUpload – Home (apache.org) 

2.实现文件上传:

2-1准备上传文件的jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/UploadGaiJing" enctype="multipart/form-data" method="post">
        <%--enctype="multipart/form-data":指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思--%>
        上传用户:<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-2准备上传完毕的jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>消息提示</title>
</head>
<body>
    ${message}
</body>
</html>

 2-3处理文件上传的Servlet

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

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.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

@WebServlet("/UploadHandleServlet")
public class UploadHandleServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        //设置文件上传路径  可自行创建文件
        String sevePath="G:/upload";
        File file=new File(sevePath);
        //判断上传文件的保存的目录是否存在
        if (!file.exists()&&!file.isDirectory()){
            System.out.println(sevePath+"目录不存在需要创建");
            //创建目录
            file.mkdir();
            // mkdir() 创建此抽象路径名指定的目录
        }
        //消息提示
        String message="";
        try{
            //使用Apache文件上传组件处理上传步骤
            //1.创建一个DiskFileItemFactory工厂
            DiskFileItemFactory factory=new DiskFileItemFactory();
            //2.创建一个文件上传解析器
            ServletFileUpload upload=new ServletFileUpload(factory);
            //解决上传文件名中文问题
            upload.setHeaderEncoding("utf-8");
            //3.判断提交上来的数据和上传表单的数据是否一致
            if (!ServletFileUpload.isMultipartContent(request)){
                //按照传统方式获取数据
                return;
            }
            //4.使用SerletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个from表单输入的值
            List<FileItem> list=upload.parseRequest(request);
            for (FileItem item:list){
                //如果fileitem中封装的是普通输入项的数据
                if (item.isFormField()){
                    String name=item.getFieldName();
                    //解决普通项的数据的中文乱码问题
                    String value=item.getString("utf-8");
                    System.out.println(name+"="+value);
                }else {//如果filename中是上传的文件
                    //得到上传的文件名称
                    String filename=item.getName();
                    System.out.println(filename);
                    if (filename==null||filename.trim().equals("")){
                        continue;
                    }
                    //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
                    //处理获取到的上传文件的文件名的路径部分,只保留文件名部分
                    filename=filename.substring(filename.lastIndexOf("\\")+1);
                    //获取item中的上传文件的输入流
                    InputStream in=item.getInputStream();
                    //创建一个文件输出流
                    FileOutputStream out=new FileOutputStream(sevePath+"\\"+filename);
                    //创建一个缓冲区
                    byte buffer[]=new byte[1024];
                    //判断输入流中的数据是否已经读完的标识
                    int len=0;
                    //循环将输入流读入到缓冲区当中,(len=in.read(buffer))<0就表示in里数据传输完毕
                    while ((len=in.read(buffer))>0){
                        //使用FileOutStream输出流将缓存区的数据写入到指定的目录(savePath + "\\" + filename)当中
                        out.write(buffer,0,len);

                    }
                    //关闭输入流
                    in.close();
                    //关闭输出流
                    out.close();
                    //删除处理文件上传时生成的临时文件
                    //item.delete();
                    message="文件上传成功!";
                }
            }
        }catch (Exception e){
            message="文件上传失败!";
        }

        request.setAttribute("message",message);
        request.getRequestDispatcher("/message.jsp").forward(request,response);
    }

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

}

现在就已经可以进行基本的文件上传了

但!还会存在一些问题

1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录 

2、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。

3、为防止一个目录下面出现太多文件,要使用hash算法打散存储。

4、要限制上传文件的最大值。

5、要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。