美文网首页java web
文件上传和下载

文件上传和下载

作者: 马佳乐 | 来源:发表于2022-04-21 19:30 被阅读0次

    文件上传

    文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件,后台接收并保存文件,这才是一个完整的文件上传。

    前台页面

    在做文件上传的时候,会有一个上传文件的界面,首先我们需要一个表单,并且表单的请求方式为POST;其次我们的form 表单的enctype必须设为"multipart/form-data",即enctype="multipart/form-data",意思是设置表单的类型为文件上传表单。默认情况下这个表单类型是"application/x-www-form-urlencoded",不能用于文件上传。只有使用了multipart/form-data才能完整地传递文件数据。

            <form action="uploadServlet" method="post" enctype="multipart/form-data">
                姓名:<input type="text" name="uname"><br>
                文件:<input type="file" name="myfile"><br>
                <button type="submit">提交</button>               
            </form> 
    

    后台实现

    使用注解@MultipartConfig将一个Servlet标识为支持文件上传。Servlet将nultipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。

    @WebServlet("/s03")
    @MultipartConfig //上传文件,必须加这个注解
    public class UploadServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("文件上传");
            //设置请求的编码格式
            req.setCharacterEncoding("utf-8");
            //获取普通表单项
            String uname = req.getParameter("uname");//表单中表单元素的name属性值
            System.out.println("uname"+uname);
            //获取Part对象(Servlet将multipart/form-data的POST请求封装成Part对象)
            Part part=req.getPart("myfile");//表单中file文件域的name属性值
            //通过Part对象得到上传的文件名
            String fileName = part.getSubmittedFileName();
            System.out.println("上传的文件名:"+fileName);
            //得到文件存放的路径
            String realPath = req.getServletContext().getRealPath("/");
            System.out.println("文件存放的路径:"+realPath);
            //上传文件到指定目录
            part.write("filePath"+"/"+fileName);
        }
    }
    

    文件下载

    文件下载,即将服务器上的资源下载(拷贝)到本地,我们可以通过两种方式下载。第一种是通过超链接本身的特性来下载;第二种是通过代码下载。

    超链接下载

    当我们在HTML或JSP页面中使用a标签时,原意是希望能够进行跳转,但当超链接遇到浏览器不识别的资源时会自动下载;当遇见浏览器能够直接显示的资源,浏览器就会默认显示出来,比如txt、png、jpg等。当然我们也可以通过download 属性规定浏览器进行下载。但有些浏览器并不支持。

    默认下载

        <!-- 当超链接遇到浏览器不识别的资源时,会自动下载 -->
        <a href="test.zip">超链接下载</a>
    

    指定download属性下载

        <!-- 当超链接遇到浏览器识别的资源时,默认不会下载。通过download属性可进行下载-->
        <a href="test.txt" down1oad>超链接下载</a>
        <a href="test.txt" down1oad="download_txt">超链接下载</a>
    

    download属性可以不写任何信息,会自动使用默认文件名。如果设置了download属性的值,则使用设置的值做为文件名。当用户打开浏览器点击链接的时候就会直接下载文件。

    后台下载

    实现步骤

    1. 需要通过response.setContentType方法设置Content-type头字段的值,为浏览器无法使用某种方式或激活某个程序来处理的MIME类型,例如"application/octet-stream"或"application/x-msdownload"等。
    2. 需要通过response.setHeader方法设置Content-Disposition头的值为"attachment,filename=文件名"
    3. 读取下载文件,调用response.getOutputStream方法向客户端写入附件内容。
            <form action="downloadServlet">
                文件名:<input type="text" name="fileName" placeholder="请输入与要下载的文件名">
                <button>下载</button>
            </form>
    
    @WebServlet("/downloadServlet")
    public class DownloadServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("文件下载");
            //设置编码格式
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=UTF-8");
            //获取参数(得到要下载的文件名)
            String fileName = req.getParameter("fileName");
            //参数的非空判断 trim(),去除字符串前后的空格
            if(fileName==null ||  "".equals(fileName.trim())) {
                resp.getWriter().write("请输入要下载的文件名:");
                resp.getWriter().close();
                return;
            }
            //得到图片存放的路径
            String path = req.getServletContext().getRealPath("/download/");
            //通过路径得到file对象
            File file = new File(path+fileName);
            //判断文件对象是否存在并且是一个标准文件
            if(file.exists() && file.isFile()) {
                //设置响应类型(浏览器无法使用某种方式或激活某个程序来处理的MIME类型)
                resp.setContentType("application/x-msdownload");
                //设置响应头
                resp.setHeader("Content-Disposition", fileName);
                //得到file文件输入流
                FileInputStream in = new FileInputStream(file);
                //得到字节输出流
                ServletOutputStream out = resp.getOutputStream();
                //定义byte数组
                byte[] bytes=new byte[1024];
                //定义长度
                int len=0;
                //循环输出
                while((len=in.read(bytes)) != -1) {
                    //输出
                    out.write(bytes,0,len);
                }
                //关闭资源
                out.close();
                in.close();
            }else {
                resp.getWriter().write("文件不存在,请重试!");
                resp.getWriter().close();
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:文件上传和下载

        本文链接:https://www.haomeiwen.com/subject/tprwertx.html