zoukankan      html  css  js  c++  java
  • webService通过response和request对象传输文件

    <code class=" hljs java">package gacl.response.study;
    2
    3 import java.io.IOException;
    4 import java.io.OutputStream;
    5 import javax.servlet.ServletException;
    6 import javax.servlet.http.HttpServlet;
    7 import javax.servlet.http.HttpServletRequest;
    8 import javax.servlet.http.HttpServletResponse;
    9
    10 public class ResponseDemo01 extends HttpServlet {
    11
    12 private static final long serialVersionUID = 4312868947607181532L;
    13
    14 public void doGet(HttpServletRequest request, HttpServletResponse response)
    15 throws ServletException, IOException {
    16 outputChineseByOutputStream(response);//使用OutputStream流输出中文
    17 }
    18
    19 /**
    20 * 使用OutputStream流输出中文
    21 * @param request
    22 * @param response
    23 * @throws IOException
    24 */
    25 public void outputChineseByOutputStream(HttpServletResponse response) throws IOException{
    26 /**使用OutputStream输出中文注意问题:
    27 * 在服务器端,数据是以哪个码表输出的,那么就要控制客户端浏览器以相应的码表打开,
    28 * 比如:outputStream.write("中国".getBytes("UTF-8"));//使用OutputStream流向客户端浏览器输出中文,以UTF-8的编码进行输出
    29 * 此时就要控制客户端浏览器以UTF-8的编码打开,否则显示的时候就会出现中文乱码,那么在服务器端如何控制客户端浏览器以以UTF-8的编码显示数据呢?
    30 * 可以通过设置响应头控制浏览器的行为,例如:
    31 * response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据
    32 */
    33 String data = "中国";
    34 OutputStream outputStream = response.getOutputStream();//获取OutputStream输出流
    35 response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
    36 /**
    37 * data.getBytes()是一个将字符转换成字节数组的过程,这个过程中一定会去查码表,
    38 * 如果是中文的操作系统环境,默认就是查找查GB2312的码表,
    39 * 将字符转换成字节数组的过程就是将中文字符转换成GB2312的码表上对应的数字
    40 * 比如: "中"在GB2312的码表上对应的数字是98
    41 * "国"在GB2312的码表上对应的数字是99
    42 */
    43 /**
    44 * getBytes()方法如果不带参数,那么就会根据操作系统的语言环境来选择转换码表,如果是中文操作系统,那么就使用GB2312的码表
    45 */
    46 byte[] dataByteArr = data.getBytes("UTF-8");//将字符转换成字节数组,指定以UTF-8编码进行转换
    47 outputStream.write(dataByteArr);//使用OutputStream流向客户端输出字节数组
    48 }
    49
    50 public void doPost(HttpServletRequest request, HttpServletResponse response)
    51 throws ServletException, IOException {
    52 doGet(request, response);
    53 }
    54
    55 }</code>

    2.2、文件下载

      文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载

    文件下载功能的实现思路:

      1.获取要下载的文件的绝对路径

      2.获取要下载的文件名

      3.设置content-disposition响应头控制浏览器以下载的形式打开文件

      4.获取要下载的文件输入流

      5.创建数据缓冲区

      6.通过response对象获取OutputStream流

      7.将FileInputStream流写入到buffer缓冲区

      8.使用OutputStream将缓冲区的数据输出到客户端浏览器

    范例:使用Response实现文件下载

    <code class=" hljs java"> package gacl.response.study;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.URLEncoder;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
    * @author gacl
    * 文件下载
    */
    public class ResponseDemo02 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    downloadFileByOutputStream(response);//下载文件,通过OutputStream流
    }

    /**
    * 下载文件,通过OutputStream流
    * @param response
    * @throws FileNotFoundException
    * @throws IOException
    */
    private void downloadFileByOutputStream(HttpServletResponse response)
    throws FileNotFoundException, IOException {
    //1.获取要下载的文件的绝对路径
    String realPath = this.getServletContext().getRealPath("/download/1.JPG");
    //2.获取要下载的文件名
    String fileName = realPath.substring(realPath.lastIndexOf("\")+1);
    //3.设置content-disposition响应头控制浏览器以下载的形式打开文件
    response.setHeader("content-disposition", "attachment;filename="+fileName);
    //4.获取要下载的文件输入流
    InputStream in = new FileInputStream(realPath);
    int len = 0;
    //5.创建数据缓冲区
    byte[] buffer = new byte[1024];
    //6.通过response对象获取OutputStream流
    OutputStream out = response.getOutputStream();
    //7.将FileInputStream流写入到buffer缓冲区
    while ((len = in.read(buffer)) > 0) {
    //8.使用OutputStream将缓冲区的数据输出到客户端浏览器
    out.write(buffer,0,len);
    }
    in.close();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    doGet(request, response);
    }
    }</code>

    注:上传和下载时调用webService接口都可以把文件转化为字节数组写入response.getOutputStream().write()里面,请求发送到另一端可以通过request将存入response里面的信息给读出来........  上传是在客户端通过response写进去,在服务端request读出来..下载是在服务端通过response写进去,在客户端request读出来.

  • 相关阅读:
    浅谈sqlserver数据库优化(一)----开光篇
    代码生成器的意愿
    面试的那些小事。
    Access和Sql区别
    牢记!SQL Server数据库开发的二十一条注意点
    SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
    ResponseUtil jackson 转换问题;返回结果与 Bean 之间的转换,推荐使用convertValue
    阿里巴巴 ali1688 Date +0800的问题
    Spring Boot 全局异常。RestControllerAdvice,ControllerAdvice
    controller 层 date 类型的参数,SpringBoot自动转换 dateformat
  • 原文地址:https://www.cnblogs.com/baihaojie/p/5685944.html
Copyright © 2011-2022 走看看