Servlet4.0 实现上传和下载

一、servlet文件上传

1)表单的设置表单的enctype,提交方式必须为post;
    <form action="up" method="post"  enctype="multipart/form-data">

2)servlet3.0版本以前需要使用第三方的jar包commons-fileupload来实现上传文件,
     servlet3.0版本自带了上传文件的api,无需第三方jar包!!

3) 文件存储在服务器当前项目的根目录下的upload文件夹中,
     通过request.getServletContext().getRealPath()获取服务器的绝对再将上传的文件。

4)    servlet3.0将上传的文件保存在Part实例中,可以通过request对象根据上传的表单控件的name获取对应的part对象,同时也支持多个文件上传;
  

5)   通过part对象可直接得到文件的输入流inputStream,在通过outputStream写到本地即可!


 6)   可以使UUID来作为文件名,至于后缀名就需要根据上传时的文件后缀来获取了,
     但是part对象里本身并没有存储上传文件的名称,我们需要从请求头信息里去获取文件名         浏览器发送上传文件请求时将文件名存储在Request Head里的Content-Disposition里;
     但Content-Disposition得值里除了文件名信息还有一些其他信息:
     Content-Disposition:form-data; name="file"; filename="test.txt"

 

 二、文件上传的效果

    2.1) 一个文件上传:

查看服务器的路径: E:\myjava\out\artifacts\myservlet_0326_war_exploded\upload 上传的图片

JSP页面 

<form action="up.action" method="post"  enctype="multipart/form-data">
   照片1: <input type="file" name="myfile"><br/>
   说明:  <input type="text" name="content"><br/>
    <input type="submit" value="上传文件">
</form>

 UploadServlet代码:

 protected void up(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //System.out.println("save !");
        //输出对象
        PrintWriter out = response.getWriter();

        //1>上传的文件保存在Part对象
        Part  part =request.getPart("myfile");


        //2>头信息文件 form-data; name="myfile"; filename="main.png"
        String desc = part.getHeader("Content-Disposition");
        //out.println(desc);

        //3) 截取图片的后缀名 .png  .jpg
        String suffix = desc.substring(desc.lastIndexOf("."),desc.length()-1);
       // out.println(suffix);

        //4)随机的生存一个32的字符串
        //498215e4-ab4a-4ffa-bb99-f0fda7d6d851.jpg
        String fileName = UUID.randomUUID()+suffix;
       // out.println(fileName);

        //5)输入流对象
        InputStream is = part.getInputStream();

        //6)动态获取服务器的路径
        String filePath = request.getServletContext().getRealPath("/upload");
        //文件是否存在
        File file =new File(filePath);
        if(!file.exists()){
            file.mkdirs();   //创建目录
        }

        //完整的路径
        String path = filePath +"/"+fileName;

//        7)写入
        FileOutputStream fos = new FileOutputStream(path);
        byte[] bty = new byte[1024];
        int length =0;
        //文件
        while ((length=is.read(bty))!=-1){
            fos.write(bty,0,length);
        }

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

        ///

        out.println();
        //关闭
        out.flush();
        out.close();


    }

 

 

 

2.2) 多个文件上传:

查看服务器的路径: E:\myjava\out\artifacts\myservlet_0326_war_exploded\upload 上传的图片 

JSP页面 

<form action="ups.action" method="post"  enctype="multipart/form-data">
   照片1: <input type="file" name="myfile"><br/>
   照片2: <input type="file" name="myfile"><br/>
   照片3: <input type="file" name="myfile"><br/>
    <input type="submit" value="上传文件">
</form>

 UploadServlet代码:

    protected void ups(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //集合对象
        List<String> fileNames = new LinkedList<String>();

        //输出对象
        PrintWriter out = response.getWriter();

        //对象集合
        Collection<Part> parts=request.getParts();

        //遍历所有的表单内容,将表单中的文件写入上传文件目录
       for (Iterator<Part> iterator=parts.iterator(); iterator.hasNext();){

           //Part对象
           Part part= iterator.next();

           //上传的文件保存在Part对象
             getFileName(request,part);
       }
        ///

        out.println();
        //关闭
        out.flush();
        out.close();


    }

    /**
     * 获得文件名
     * @param request
     * @param part
     * @throws IOException
     */
    private void getFileName(HttpServletRequest request,Part part) throws IOException {
        //2>头信息文件 form-data; name="myfile"; filename="main.png"
        String desc = part.getHeader("Content-Disposition");

        //3) 截取图片的后缀名 .png  .jpg
        String suffix = desc.substring(desc.lastIndexOf("."),desc.length()-1);

        //4)随机的生存一个32的字符串
        //498215e4-ab4a-4ffa-bb99-f0fda7d6d851.jpg
        String fileName = UUID.randomUUID()+suffix;
        // out.println(fileName);

        //5)输入流对象
        InputStream is = part.getInputStream();

        //6)动态获取服务器的路径
        String filePath = request.getServletContext().getRealPath("/upload");
        //文件是否存在
        File file =new File(filePath);
        if(!file.exists()){
            file.mkdirs();   //创建目录
        }

        //完整的路径
        String path = filePath +"/"+fileName;

//        7)写入
        FileOutputStream fos = new FileOutputStream(path);
        byte[] bty = new byte[1024];
        int length =0;
        //文件
        while ((length=is.read(bty))!=-1){
            fos.write(bty,0,length);
        }

        //流关闭
        is.close();
        fos.close();
    }

三、文件下载的效果

 

JSP页面

<body>
<a href="down.action?fileName=d88c4317-5aa8-4384-991e-7c1757640fe0.jpg">下载图片</a>
</body>

UploadServlet 代码

  protected void down(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

         //请求文件名
        String str =request.getParameter("fileName");

        //服务器路径(注意必须有这个文件)
        String path = request.getServletContext().getRealPath("/upload")+"/"+str; //默认认为文件在当前项目的根目录

        System.out.println(path);

       //输入流
        FileInputStream fis = new FileInputStream(path);
        //响应头信息
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Disposition", "attachment; filename="+str);
       //文件写入
        ServletOutputStream outs = response.getOutputStream();
        byte[] bt = new byte[1024];
        int length = 0;
        while((length=fis.read(bt))!=-1){
            outs.write(bt,0,length);
        }
        //关闭流
        outs.close();
        fis.close();

    }

注意:  如果是MVN工程,要从服务器上下载图片时,这个服务器路径是有权限的,不能访问:   C:\myjava\mvn_0327\target\mvn_0327\upload\

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值