实现文件上传

1.创建jsp页面  表单和文件上传元素  声明表单属性 enctype="mulitiper/form-data"
2.创建servlet  声明注解@MultipartConfig 表示此servlet支持文件上传
3.声明路径:req.getSession().getServletContext().getRealPath("upload/");服务器文件系统上的绝对路径
4.对路径进行判断 不过不存在  则新建一个
5.获取Part对象  request.getPart
6.写一个提取文件名称的方法 (参数 part)  获取并拆分头信息,拿到其中的filename
7.通过获取文件名称的方法提取文件名
8.part.write写入指定路径
9.给返回信息

比如 上传单个文件:

jsp页面:

 <body>
  <form action="FileServlet" enctype="multipart/form-data" method="post">
    上传文件:<input type="file" name="ufile">
    <input type="submit" value="提交">
  </form>
  </body>

FileServlet:

  • @MultipartConfig(maxFileSize = 1024*1024*2)  //表示servlet支持文件上传  文件最大值为2MB
  • //获取注解里面设置的值
    private static MultipartConfig config=FileServlet.class.getAnnotation(MultipartConfig.class);
  • //允许上传的图片类型
    private String Type="image/gif;image/png;image/jpg";
  • //上传文件路径
    //服务器文件系统上的绝对路径
    //success-->获取会话
    //getServletContext--->获取 Servlet 上下文
    //getRealPath--->获取真实路径
    //filePath--->文件路径
    String filePath = request.getSession().getServletContext().getRealPath("upload/");
  • //获取头信息
    String con = part.getHeader("content-disposition");
@WebServlet("/FileServlet")
@MultipartConfig(maxFileSize = 1024*1024*2)  //表示servlet支持文件上传  文件最大值为2MB
public class FileServlet extends HttpServlet {
    //获取注解里面设置的值
    private static MultipartConfig config=FileServlet.class.getAnnotation(MultipartConfig.class);
    //允许上传的图片类型
    private String Type="image/gif;image/png;image/jpg";
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //上传文件路径
        //服务器文件系统上的绝对路径
        //success-->获取会话
        //getServletContext--->获取 Servlet 上下文
        //getRealPath--->获取真实路径
        //filePath--->文件路径
        String filePath = request.getSession().getServletContext().getRealPath("upload/");
        //如果没有路径   创建一个
        File file=new File(filePath);
        if (!file.exists()){
            file.mkdir();
        }
        String message;
        try {
            //获取part对象
            Part part = request.getPart("ufile");
            //获取类型
            String type = part.getContentType();
            // Arrays.asList  把数组转换为集合
            List<String> types = Arrays.asList(Type.split(";"));
            //在允许的范围内查找
            if (!(type==null || "".equals(type.trim())) && types.contains(type)){  //不空 并且集合中包含类型
                //提取文件名
                String name = getFileName(part);
                //将文件写入路径
                part.write(filePath+File.separator+name);

                message="上传成功,文件名为"+name+",文件大小为:"+part.getSize()+"bytes!";
            }else {
                message="上传失败类型不支持";
            }

        }catch (IllegalStateException i){
            message="上传失败!文件过大,文件的限制为"+config.maxFileSize()+"bytes!";
        }catch (Exception e){
            e.printStackTrace();
            message=e.getMessage();
        }

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

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
    //从Http header中提取文件上传的名称
    private  String getFileName(Part part){
        //获取头信息
        String con = part.getHeader("content-disposition");
        String[] items = con.split(";");
        for (String str : items) {
            if (str.trim().startsWith("filename")){

                return str.substring(str.indexOf("=")+2,str.length()-1);
            }
        }
        return "";
    }
}

上传多个文件大同小异:

jsp页面:

<form action="FilesServlet" enctype="multipart/form-data" method="post">
    上传文件:<input type="file" name="ufile01">
    上传文件:<input type="file" name="ufile02">
    <input type="submit" value="提交">
</form>
</body>
FilesServlet:
@WebServlet("/FilesServlet")
@MultipartConfig
public class FilesServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //准备路径
        String path="E:\\JDBC";
        //如果不存在新建
        File file=new File(path);
        if (!file.exists()){
            file.mkdir();
        }
        Collection<Part> parts = request.getParts();
        //循环处理
        for (Part part : parts) {
            if (part.getName().startsWith("ufile")){
                String fileName=getFileName(part);
               part.write(path+File.separator+fileName);
            }
        }
        String message="上传成功";
        request.setAttribute("m",message);
        request.getRequestDispatcher("success.jsp").forward(request,response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
    //从Http header中提取文件上传的名称
    private  String getFileName(Part part){
        //获取头信息
        String con = part.getHeader("content-disposition");
        String[] items = con.split(";");
        for (String str : items) {
            if (str.trim().startsWith("filename")){

                return str.substring(str.indexOf("=")+2,str.length()-1);
            }
        }
        return "";
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值