http中的Content-Type详解

介绍

  • MediaType,即是Internet Media Type,互联网媒体类型;也叫做MIME类型
  • 在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。
  • response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。

媒体格式类型

Content-Type媒体格式
text/htmlHTML,HTM格式
text/plain纯文本格式
text/xmlXML格式
image/gifgif图片格式
image/jpegjpg,jpeg,jpe图片格式
image/pngpng图片格式
application/xhtml+xmlXHTML格式
application/xmlXML数据格式
application/atom+xmlAtom XML聚合格式
application/jsonJSON数据格式,由于json规范的流行,各大浏览器都开始原生支持JSON.stringfy。而且spring对这个content-Type上传的数据有很好的支持,可以直接通过@RequestBody进行接收。也是当前完美适配当前流行的RestApi。
application/pdfpdf格式
application/mswordWord文档格式
application/vnd.ms-excelexcel格式
application/vnd.ms-powerpointppt格式
application/octet-stream二进制流数据(如常见的文件下载,不知道下载文件类型)
application/x-www-form-urlencoded中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
multipart/form-data需要在表单中进行文件上传时,就需要使用该格式
application/binary二进制

@RequestMapping关于Content-Type的使用

  1. consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;consumes="application/json"表示方法仅处理Content-Type为“application/json”类型的请求
  2. produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回,produces="application/json"表示处理request请求中Accept头中包含了"application/json"的请求,也就是暗示返回的文件类型为application/json
  3. headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求 headers = "Accept=application/json"表示方法仅处理请求头中有Accept=application/json的请求
  4. 基于headers, consumes,produces对请求和响应中的媒体内容格式做控制和过滤

HttpServletResponse关于Content-Type的使用

  1. response.setContentType的意思就是高速客户端在解析这个返回包的时候用的是哪种解析方式
  2. 客户端根据多媒体类型,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据
  3. 下载或预览文件,常和报文头content-disposition配合使用,对报文体进行描述,规定了接收端的显示处理行为,此报文头的值有两种, attachmentinline, 分别表示保存 还是 直接显示。

下载excel文件

private void setWorkbookResponse(Workbook workbook, HttpServletResponse response) throws Exception {
    if (workbook != null) {
        ServletOutputStream out = null;

        try {
            String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
            String headStr = "attachment; filename=\"" + fileName + "\"";
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", headStr);
            out = response.getOutputStream();
            workbook.write(out);
            out.flush();
        } catch (IOException var16) {
        } finally {
            if (null != out) {
                out.close();
            }
        }
    }
}

预览html文件

private void setWorkbookResponseToHTML(Workbook workbook, HttpServletResponse response) throws Exception {
    if (workbook != null) {
        ServletOutputStream out = null;
        //03 版本EXCEL预览  .xls   有图片
        ExcelToHtmlParams params = new ExcelToHtmlParams(workbook,true,"yes");

        try {
            String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".html";
            //String headStr = "attachment; filename=\"" + fileName + "\"";
            String headStr = "inline; filename=\"" + fileName + "\"";
            response.setContentType("text/html");
            response.setHeader("Content-Disposition", headStr);
            out = response.getOutputStream();
            out.write(ExcelXorHtmlUtil.excelToHtml(params).getBytes());
            out.flush();
        } catch (IOException var16) {
        } finally {
            if (null != out) {
                out.close();
            }
        }
    }
}

二进制格式

private void setWorkbookResponseWithBinary(Workbook workbook, HttpServletResponse response) {
    if (workbook != null) {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            ServletOutputStream out = null;
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            workbook.write(os);
            byte[] content = os.toByteArray();
            InputStream is = new ByteArrayInputStream(content);
            // 设置response参数,可以打开下载页面
            response.reset();
            response.setContentType("application/binary;charset=UTF-8");
            String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Credentials", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "*");

            out = response.getOutputStream();
            bis = new BufferedInputStream(is);
            bos = new BufferedOutputStream(out);

            byte[] buff = new byte[2048];
            int bytesRead;
            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
                bos.write(buff, 0, bytesRead);
            }
        }catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (bis != null) {
                    bis.close();
                }
                if (bos != null) {
                    bos.close();
                }
            } catch (IOException e) {
            }
        }
    }
}
  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大佬腿好粗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值