传统文件上传下载+服务器和浏览器之间编码转换+判断浏览器类型

pom.xml导包 lib更新

<dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId> <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>

1.客户端上传文件的jsp页面中

上传文件夹的form标签注意 enctype="multipart/form-data"> <input type="file"

<form action="user/fileupload" method="post" enctype="multipart/form-data"> 
选择文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上传文件"/>
  </form>

web.xml把上传文件请求发到服务端的方法中 处理流程

  • 判断上传的数据是不是多段数据(多段数据才是文件)
  • 创建工厂实现类
  • 创建解析上传数据的工具类对象 对象调用parseRequest(req)方法解析文件返回表单项的集合 抛异常
  • 对于解析方法返回的表单项集合要去判断表单项是普通表单项还是上传文件的表单项 用isFormFiled()方法 判断
  • 如果是上传文件表单项 我们就把上传的文件保存到具体的磁盘位置
    fileItem.write
 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("文件上传请求已被服务端接收....待服务端行动");        
        //判断是否是多段数据
        if(ServletFileUpload.isMultipartContent(req))
        {     //创建表单项的工厂
            FileItemFactory factory=new DiskFileItemFactory();
            //解析上传数据的工具类
            ServletFileUpload servletFileUpload=new ServletFileUpload(factory);
            List<FileItem> fileItems=null;
            try {
                //解析返回表单项集合
               fileItems= servletFileUpload.parseRequest(req);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //遍历表单项
            for(FileItem fileItem: fileItems)
            {    // 判断文件项是普通字段,还是上传的文件
                if(fileItem.isFormField())//普通的表单项
                {

                }else
                {
                    String fileName=fileItem.getName();
                    try {
                        fileItem.write(new File("E:\\"+fileName));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

文件的下载 直接访问url即可 不用什么页面

在这里插入图片描述

  • 目前这个老师写的file是直接在Web目录下创建的 通常我们都是在WEB-INF下面创建 所以一般写成"/WEB-INF/file/"

  • 所以index.jsp在跳转的时候写成/index.jsp
    http://ip地址端口号/项目别名(模块别名)/代码的Web目录/index.jsp

  • ${PageContex.request.ContextPath}/user/login 前面这些也是
    http://ip地址端口号/项目别名(模块别名)/user/login
    http://ip地址端口号/项目别名(模块别名)/Servlet的URL

在web的WEB-INF下的文件客户端没有权限访问 只有服务器段有权限
我们把客户想要下载的文件放在web-inf下面

控制器中的方法是

1.获取要下载的文件名

2.获取ServletContext对象
在这里插入图片描述
3.在回传之前 通过响应头告诉客户端返回的数据类型(下载的文件类型)是什么

4.使用响应头 告诉客户端当前的数据是用于下载的
resp.setHeader("Content-Disposition","attachment; filename="+fileName);
Context-Disposition:内容处理 如何处理呢?
attachment:表示附件 说明是下载处理
filename:后面接着文件名(客户端下载的时候显示给客户的文件名)

  1. 真正传给客户端
  • 通过ServletContext对象读取web-inf下面的文件返回字节流
  • resp调用getOutputStream()方法 获取响应给客户端的输出字节流
  • commons包封装的IOUtils.copy() 把ServletContext对象读取文件返回的字节流 复制给 响应输出流传给客户端
    以上5步顺序不可改
  @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String fileName="a.jpg";
     //获取serverletCOntex对象
        ServletContext servletContext=getServletContext();
     //通过响应头设置回传文件类型
        String mimeType = servletContext.getMimeType("/images/" + fileName);
        resp.setContentType(mimeType);
   //通过响应头告诉客户端文件是可下载的
        resp.setHeader("Content-Disposition","attachment; filename="+fileName);
     //真正的将解析文件字节流赋值到响应的输出流中
        InputStream resourceAsStream = servletContext.getResourceAsStream("/WEB-INF/images/" + fileName);
        ServletOutputStream outputStream = resp.getOutputStream();
        IOUtils.copy(resourceAsStream,outputStream);
    }

IE/谷歌 对于服务器写给客户端的中文无法识别 会乱码
编码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 resp.setHeader
 ("Content-Disposition","attachment; filename==?UTF-8?B?"
 +new BASE64Encoder().encode("中国.jpg".getBytes("UTF-8"))+"?=");

在这里插入图片描述
所以现在IE/火狐不兼容

判断请求是从什么浏览器发出

在这里插入图片描述
请求头的User-Agent是包含浏览器信息的
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值