文件上传与下载

文件上传与下载

1、文件上传

  • 1、要有一个form标签,method=post请求(地址栏有长度限制,不能用get)

  • 2、form标签的encType属性的值必须为multipart/form-data(声明数据以多段形式拼接,以流形式传给服务器)

  • 3、在form标签使用input type=file添加上传文件

  • 4、在服务端编写接收代码

    代码示例:

    <form method="post" enctype="myltipart/form-data">
        用户名:<input type="text" name="usrname"/>
        头像:<input type="file" name="photo" />
        <input type="submit" value="提交" />
    </form>
    
    public class upload extends HttpServlet{
    	 @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doGet(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //以流的形式接收
            ServletInputStream inputStream=req.getInputStream();
            //创建一个缓存区
            byte[] buffer= new byte[1024 * 1024];
            //返回接收字节
            int read=inputStream.read(buffer);
        }
    
    }
    

    需要用到的两个jar包:commons-io 与commons-fileupload

    fileupload常用类和方法:
        Fileitem类:上传的文件对象,可以是多个文件,每个上传的文件都是一个单独的FileItem对象。
    DiskFileItemFactory:磁盘文件工厂类,设置上传文件保存的磁盘目录,缓冲区大小。
        FileItem:上传的文件对象,可以是多个文件,每个上传的文件都是一个单独的FileItem对象。
    
 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //判断上传的数据是否是多端数据
        if(ServletFileUpload.isMultipartContent(req)){
            //创建diskfileItemFactory实现类
            DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory();
            //创建用于解析上传数据的工具类
            ServletFileUpload servletFileUpload=new ServletFileUpload(diskFileItemFactory);

            try {
                //获得每一个表单项
                List<FileItem> list=servletFileUpload.parseRequest(req);
                //循环判断是不是普通的表单数据
                for (FileItem fileItem : list) {
                    if (fileItem.isFormField()){
                        //true 普通表单项
                        System.out.println("表单项属性值"+fileItem.getFieldName());
                        System.out.println("表单项value值"+fileItem.getString("UTF-8"));
                    }else {
                        //文件表单
                        System.out.println("表单项name属性值"+fileItem.getFieldName());
                        System.out.println("文件名"+fileItem.getName());
                        //写入磁盘
                        fileItem.write(new File("e:\\"+fileItem.getName()));


                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
        }


2、下载文件

        //获取下载的文件名
        String filename="1.jpg";
        String mineType=getServletContext().getMimeType("/file/"+filename); //获取文件类型
        
//设置响应头,告诉客户端下载 attachment是附件的意思,文件名是指被下载的文件文件名。
        resp.setHeader("Content-Dispositon","attachment;filename=文件名");

        //2、读取下载的文件内容 通过ServletContext可以读取
        ServletContext servletContext=getServletContext();
        //斜杠=http://ip:port/工程名/
        InputStream inputStream=servletContext.getResourceAsStream("/file/"+filename);
        //获取输出流
        OutputStream outputStream=resp.getOutputStream();
        //将输入流复制到输出流
        IOUtils.copy(inputStream,outputStream);

如果文件名是中文,可以通过URLEncoder.encode进行编码转换

 resp.setHeader("Content-Dispositon","attachment;filename=中国.jpg");//有中文会乱码
  resp.setHeader("Content-Dispositon","attachment;filename="+URLEncoder.encode("中国.jpg","UTF-8"));
posted @ 2021-03-06 22:41  废熊  阅读(69)  评论(0)    收藏  举报