form表单文件上传,servlet文件接收

1.需要导入jar包

2.index.html 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
        <!--为了利用DiskFileItemFactory实现文件上传,在html或jsp页面中,form表单中method必须设置为post,并且要设置enctype=”multipart/form-data”:  -->
        <form action="FileServlet" method="post" enctype="multipart/form-data">
        姓名:<input type="text" name="uname">
        密码:<input type="password" name="pwd">
        文件:<input type="file" name="myfile">
        
        <input type="submit" value="提交">
    </form>
    
</body>
</html>

3.FileServlet.java  servlet接收文件代码

package web;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

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 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;
/*
 * @WebServlet注解用于标注在一个继承了HttpServlet类之上,属于类级别的注解
 * 其中/FileServlet 表示访问该servlet的 url 映射(地址)(此处为相对路径,即 "项目名称/FileServlet" )
 * 该注解的作用等价于 在web.xml中配置的该servlet的<servlet-mapping>元素中<url-pattern>的配置
 * */
@WebServlet("/FileServlet")
public class FileServlet extends HttpServlet {// 扩展 HttpServlet 类
    //serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性,用于版本控制
    private static final long serialVersionUID = 1L;
       
    // 处理 GET 方法请求的方法
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建一个解析器工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //文件上传解析器
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 判断enctype属性是否为multipart/form-data 
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if (isMultipart) {
            try {
                //解析请求,将表单中每个输入项封装成一个FileItem对象
                List<FileItem> fileItems = upload.parseRequest(request);
                // 迭代表单数据
                for (FileItem fileItem : fileItems) {
                    //判断输入的类型是 普通输入项 还是文件
                    if (fileItem.isFormField()) {
                        //普通输入项 ,得到input中的name属性的值,fileItem.getFieldName()
                        ////得到输入项中的值,fileItem.getString("UTF-8"),"UTF-8"防止中文乱码
                        System.out.println(fileItem.getFieldName()+"\t"+fileItem.getString("UTF-8"));
                    } else {
                        //上传的是文件,获得文件上传字段中的文件名
                        //注意IE或FireFox中获取的文件名是不一样的,IE中是绝对路径,FireFox中只是文件名
                        String fileName = fileItem.getName();
                        System.out.println(fileName);
                        //Substring是字符串截取,返回值是一个截取后的字符串
                        //lastIndexOf(".")是从右向左查,获取.之后的字符串
                        String ext = fileName.substring(fileName.lastIndexOf("."));
                        //UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法, UUID的唯一缺陷在于生成的结果串会比较长
                        String name = UUID.randomUUID()+ext;
                        //将FileItem对象中保存的主体内容保存到某个指定的文件中
                        File file = new File("E:\\火影忍者\\"+name);
                    
                        fileItem.write(file);
                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }else{
            System.out.println("普通表单");
        }
        
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

猜你喜欢

转载自www.cnblogs.com/jiangaihu/p/10954077.html