文件上传案例

文件上传案例

(狂神老师的案例)文件上传主要是思路,首先我们需要知道的是,我们是如何把一个文件进行上传的。

我们先在本地找到了要上传的文件->把文件交给浏览器->浏览器通过发送请求,把文件变成流通过网络传输到服务器->服务器接收到之后需要判断是否有文件的存在->如果有就需要对文件和字段进行区分->如果检测到是文件的话就需要解析,解析请求数据,创建磁盘保存文件夹,根据可以接收的文件和传输路径保存文件。

代码虽然多,但是只要思路清晰即可。

需要注意的问题:
①如果报了IllegalStateException: ContainerBase.addChild这个类型的错误,可以检查一下是不是web项目的artifact没有导入jar包

代码(FileServlet)

@WebServlet("/file")
public class FileServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        //如果不包含文件就直接结束方法
        if (!ServletFileUpload.isMultipartContent(request)) {
            return;
        }

//        获取tomacat项目磁盘的位置,并且创建保存在web-inf下面的文件夹,把文件保存在那里
        String upLoadPath=this.getServletContext().getRealPath("WEB-INF/Upload");
        File fileUpLoad=new File(upLoadPath);
//        如果不存在就直接创建文件目录
        if(!fileUpLoad.exists()){
            fileUpLoad.mkdir();
            System.out.println("创建成功");
        }

//        创建临时文件
        String temppath=this.getServletContext().getRealPath("WEB-INF/tmp");
        File filetmp=new File(temppath);
        if(!filetmp.exists()){
            filetmp.mkdir();
            System.out.println("创建成功");
        }

        try{
            //创建DiskFileItemFactory,并且处理文件上传路径和限制文件大小
            DiskFileItemFactory factory=getDisFileItemFactory(filetmp);
//            获取upload对象
            ServletFileUpload upload=getServletFileUpLoad(factory);
//            使用upload对象,并且解析和处理文件,上传文件
            String msg=uploadParseRequest(upload,request,upLoadPath);

            System.out.println("可以结束了");
            request.setAttribute("msg",msg);
            request.getRequestDispatcher("/test.jsp").forward(request,response);


        }catch (FileUploadException e){
            e.printStackTrace();
        }


    }

    /**
     *正式解析请求中的文件,判断是文件还是键值对
     * @param upload
     * @param request
     * @param upLoadPath
     * @return
     */
    private String uploadParseRequest(ServletFileUpload upload, HttpServletRequest request, String upLoadPath) throws FileUploadException, IOException {
        String msg = "";
//        解析请求,把所有的请求数据封装成一个fileItems,DiskFileItem是处理磁盘的,FileItem是处理请求数据
        List<FileItem> fileItems=upload.parseRequest(request);
        for(FileItem item:fileItems){
            if(item.isFormField()){
                String name=item.getFieldName();
                String value=item.getString("UTF-8");
                System.out.println(name+":"+value);
            }else{
                System.out.println("我进入了");
//                获取文件名称
                String upLoadFileName=item.getName();
                System.out.println("上传的文件名:"+upLoadFileName);

//                如果文件不正常就不加载
                if(upLoadFileName.trim().equals("")||upLoadFileName==null){
                    continue;
                }

//                获取文件名
                String fileName=upLoadFileName.substring(upLoadFileName.lastIndexOf("/")+1);
//                获取文件后缀名
                String fileExtName=upLoadFileName.substring(upLoadFileName.lastIndexOf(".")+1);

                //UUID可以创建一个唯一的数字,保证文件名的唯一性
                //任何一个类在网络传输都需要序列化

//                获取文件名
                String uuidPath= UUID.randomUUID().toString();
                System.out.println("文件名:"+fileName+"文件类型后缀:"+fileExtName);

                String uuidFileName = UUID.randomUUID().toString();

                System.out.println("我到这里了");
//                获取文件上传的流,其实就是获取文件的信息
                InputStream is = item.getInputStream();

                FileOutputStream fos=new FileOutputStream(upLoadPath+"/"+uuidFileName+"."+fileExtName);
//              创建了缓冲区
                byte[] buffer=new byte[1024*1024];

                int len=0;

                while((len=is.read(buffer))>0){
                    fos.write(buffer,0,len);
                }

                fos.close();

                is.close();

                msg="上传成功";
                item.delete();

            }
        }
        System.out.println("我返回了");
        return msg;
    }


    /**
     * 设置文件上传情况。设置可传文件的大小
     * @param factory
     * @return
     */
    private ServletFileUpload getServletFileUpLoad(DiskFileItemFactory factory) {
        //处理文件的解析器
        ServletFileUpload upload=new ServletFileUpload(factory);
//        文件处理的过程情况,和上传情况
        upload.setProgressListener(new ProgressListener() {
            @Override
            public void update(long l, long l1, int i) {
                System.out.println("文件大小:"+l1+"已经上传了:"+l+"   百分比"+l/l1*100+"%");
            }
        });

//        处理字符集问题
        upload.setHeaderEncoding("UTF-8");
//        文件的最大值
        upload.setFileSizeMax(1024*1024*10);
//       总共能上传的文件大小
        upload.setSizeMax(1024*1024*10);

        return upload;
    }

    /**
     * 文件太大就存在tmp文件夹里,设置好缓存,实际上就是为了处理那些上传的文件比缓存还大的文件,限制文件大小
     * 并且处理临时文件的路径
     * @param filetmp
     * @return
     */
    private DiskFileItemFactory getDisFileItemFactory(File filetmp) {
        DiskFileItemFactory factory=new DiskFileItemFactory();
        //缓冲区大小
        factory.setSizeThreshold(1024*1024);
        factory.setRepository(filetmp);
        return factory;
    }

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

代码(index.jsp)

<form action="${pageContext.request.contextPath}/file" method="post" enctype="multipart/form-data">
  <p><input type="text" name="good"></p>
  <p><input type="file" name="file1"></p>
  <p><input type="file" name="file2"></p>
  <p><input type="submit"></p>
</form>
</body>
</html>

代码(test.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
这就是test
${requestScope.msg}

</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值