java 文件上传代码

@Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //判断请求是否为Multipart请求
        if(!ServletFileUpload.isMultipartContent(req)){
            throw new RuntimeException("当前请求不支持文件上传");
        }

        try {
            //创建一个FileItem工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();

            //设置使用临时文件的边界值,大于该值,上传文件会先保存在临时问价中,否则上传文件将直接写入内存
            //单位:字节
            factory.setSizeThreshold(1024*1024);

            //设置临时文件
            String tempPath = this.getServletContext().getRealPath("/temp");
            File temp = new File(tempPath);
            factory.setRepository(temp);

            //创建文件上传核心组件
            ServletFileUpload upload = new ServletFileUpload(factory);

            //设置item的头部字符编码,可以解决文件名的中文乱码问题
            upload.setHeaderEncoding("UTF-8");

            //设置单个上传文件的最大边界值为2M
            upload.setFileSizeMax(1024*1024*2);

            //设置一次上传所有文件的总和最大值为5M(对于上传多个文件时起作用)
            upload.setSizeMax(1024*1024*5);

            //解析请求,获取所有的item
            List<FileItem> items = upload.parseRequest(req);
            //遍历items
            for(FileItem item:items){
                if(item.isFormField()){ //若item为普通表单项
                    String fieldName = item.getFieldName();     //获取表单项名称
                    String fieldValue = item.getString("UTF-8");       //获取表单项的值
                    System.out.println(fieldName+"="+fieldValue);

                }else {     //若item为文件表单项
                    String fileName = item.getName();      //获取上传文件原始名称
                    fileName = System.currentTimeMillis()+fileName;//防止上传相同名字的文件覆盖的问题
                    //获取输入流,其中有上传文件的内容
                    InputStream is = item.getInputStream();
                    //获取文件保存在服务器的路径
                    String path = this.getServletContext().getRealPath("/files");
                    System.out.println(path);

                    //获取当前系统时间(在指定的files文件加下创建子目录,以当天的时间命名)
                    Date date = new Date();
                    //格式件日期
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                    String now = sdf.format(date);
                    path = path + "/" +now;

                    //若目录不存在,则创建这个目录
                    File dirFile = new File(path);
                    if(!dirFile.exists()){
                        dirFile.mkdir();
                    }
                    //创建目标文件,用于保存上传文件
                    File descFile = new File(path,fileName);
                    //创建文件输出流
                    FileOutputStream os = new FileOutputStream(descFile);
                    //将输入流中的数据写到输出流中
                    int len = -1;
                    byte[] buffer = new byte[1024];
                    while ((len=is.read(buffer))!= -1){
                        os.write(buffer,0,len);
                    }

                    //关闭流
                    os.close();
                    is.close();

                    //删除临时文件
                    item.delete();
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值