servlet的文件上传

文件上传

文件上传要点:

1.导入相应jar包:commons-fileupload.jar和commons-io.jar

2.form表单的method为必须是post方式(因为get方式是通过地址栏传递,能够承载的大小有限),enctype必须是multipart/form-data

1.upload.jsp

<form action="uploadServlet" method="post" enctype="multipart/form-data">
      请选择文件:<input type="file" name="file"/><<br>
      <<input type="submit" value="提交">
    </form>

2.UploadServlet.java

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.首先判断是否为多媒体文件
        if(!ServletFileUpload.isMultipartContent(req)){
            PrintWriter out = resp.getWriter();
            out.println("表单必须包含:enctype='multipart/form-data'");
            out.flush();
            return;
        }else{
            //创建工厂
            DiskFileItemFactory factory=new DiskFileItemFactory();
            //设置内存临界值,超过将存放到临时目录下
            factory.setSizeThreshold(1024*1024*3);//3M
            //设置临时目录
            factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
            //将配置好的factory传给servlet的上传处理类
            ServletFileUpload upload=new ServletFileUpload(factory);
            //中文处理
            upload.setHeaderEncoding("UTF-8");
            //开始上传
            try {
                List<FileItem> fileItems = upload.parseRequest(req);
                //遍历fileItems
                if (fileItems!=null && fileItems.size()>0){
                    for (FileItem fileItem : fileItems) {
                        if (!fileItem.isFormField()){
                          	//将上传的文件存储到本地
                            String fileName=new File(fileItem.getName()).getName();
                            String filePath="D:\\img"+File.separator+fileName;
                            File file=new File(filePath);
                          	//将fileItem的内容写到本地存储目录
                            fileItem.write(file);
                            req.setAttribute("filename", fileName);
                        }
                    }
                }
                req.getRequestDispatcher("show.jsp").forward(req, resp);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

3.show.jsp

<img src="/img/<%=request.getAttribute("filename")%>"/>  --显示我们本地存储的文件

这里我们需要注意的是:目前已经不许将图片的路径设为绝对路径,也就是图片在硬盘的存储路径。所以我们只能使用虚拟路径,那么我们就要给本地存储目录配置虚拟路径,虚拟路径的配置可以在tomcat的server.xml中配,配置如下:

如果是使用IDEA的话,也可以不在server.xml中配置,可以直接在项目中配,打开Edit Configurations,具体看下图:

在这里插入图片描述

4.示例遇到的小问题

在写这个示例的时候遇到一个小问题如下:

java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component

原因是只是将外部引入的jar包放到了libraries下,但是artifacts中没有,所以需要在artifacts中再添加一次,具体如下图:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值