Java通过Http请求服务器图片输出、下载、转换

  Java开发过程中总会遇到从服务器中请求文件(图片、text文档等)。此处详情记录从服务器下载图片的方法,以及以多种方式输出。

1、整体流程:

建立Htpp通讯——设置请求参数——接受响应——读写响应数据——图片处理

2、代码部分

public class imageController{
  //日志
  private Logger logger = LoggerFactory.getLogger(getClass());
  
  @RequestMapping("downloadImage")
  @ResponseBody
  public boolean downloadImage(HttpServletRequest req,HttpServletResponse resp){
    logger.info("\r\n------图片下载接口开始调用------\r\n");
    boolean result = false;//设置返回结果
    Image image = null;
    
    String imagePath = request.getParameter("imagePath");//获取前端传递图片路径
    if(null == imagePath || "".equals(imagePath) || "null".equals(imagePath)){//判断图片路径是否为空
      return result;
    }     //方法一:将图片保存至本地临时文件中
    File tempFile = null;     //方法二:将图片保存至本地制定目录下
    File tempFile = new File("D:/image");
    if(!file.exists){//判断该路径是否存在,若不存在创建目录
      file.mkdir();
    }     //方法四:直接输出至客户端(参数中+resp)
    try{
      tempFile = File.createTempFile("tempFile",".png");//设置零时文件名称、格式(文件名长度必须大于3位)
      downLoad(tempFile,req);
      result = true;
    }catch(Exception e){
      Logger.error(e.getMessage(),e);
    }finally{
      if(tempFile!=null){
        tempFile.delete();
        logger.info("\r\n------临时文件已删除------\r\n");
      }
      return result;//返回结果
    }
  }   public void downLoadToFile(File file,HttpServletRequest req){
    FileOutputStream out = null;
    InputStream in = null;
    HttpURLConnection httpUrlConnection = null;
    String urlPath = req.getParameret("urlPath");//获取前端传递请求地址
    String param1 = req.getParameter("param1");//参数1
    String param2 = req.getParameter("param2");//参数2
    try{
      //Http请求建立通讯
      Url url = new Url(urlPath);
      URLConnection urlConnection = url.openConnection();//打开通讯
      httpUrlConnection = (HttpURLConnection)urlConnection;
      
      //设置请求参数
      httpUrlConnection.setDoOutpu(true);//是否向httpUrlConnection输出
      httpUrlConnection.setDoInput(true);//是否向httpUrlConnection输入
      httpUrlConnection.setRequestMethod("POST");//设置请求方式
      httpUrlConnection.setUsrCaches(false);//是否设置缓存(请求凡是为post,不可以设置缓存)
      httpUrlConnection.setRequestProperty("Content-type","application/x-java-serialized-object");//设定传参内容类型是可序列化的java对象
      httpUrlConnection.setRequestProperty("connection","Keep-Alive");//保持与服务器链接
      httpUrlConnection.setRequestProperty("Charsert","UTF-8");//设置编码
      httpUrlConnection.setConnectTimeOut(3000);//设置与主机链接超时时间
      httpUrlConnection.setReadTimeOut(6000);//设置从服务器读取数据超时时间
      httpUrlConnection.addRequestProperty("");//不管key值是否存在直接添加       String param = "param1="+param1+"&param2="+param2;//设置参数。参数传递另外一种方式:直接将参数param拼接在请求地址url后面
      
      //连接
      httpUrlConnection.connect();
      
      //传递参数之后重新写入
      OutputStream outputStream = httpUrlConnection.getOutputStream();
      outputStream.write(param.getBytes("UTF-8"));//解决中文乱码
      outputStream.flush();//清空缓冲区
      outputStream.close();       //获取响应数据
      in = httpUrlConnection.getInputSream();
      out = new FileOutputStream(file.getPath());//文件输出流(方法一使用)
      out = new FileOutputStream(file.getPath()+"/"+"文件名称");(方法二使用)
      byte[] buffer = new byte[1024];//设置每次读取大小
      int readLength = 0;
      
      方法三:将流文件直接转换为Image对象
      OutputStream outputStream = new OutputStream();
      byte[] data = new byte[1024];
      int b = 0;
      while((b = in.read(data)) != -1){
        outputStream.write(data,0,b);
      }
      BufferedImage bufferedImage = Image.read(outputStream);
      outputStream.flush();       //方法四:直接将图片输出值客户端
      //设置相应图片格式济缓存
      resp.setHeader("content-type","image/png");
      resp.setHeader("Cache-control","no-cache");
      resp.setHeader("Pragma","no-cache");
      
      OutputStream outputStream = resp.getOutputStream();//从响应中获取输出流之间图片输出值响应中
      byte[] data = new byte[1024];
      int b = 0;
      while((b = in.read(data)) != -1){
        outputStream.write(data,0,b);
      }
      outputStream.flush();       //方法五:输出流之间的转换
      OutputStream outputStream = resp.getOutputStream();
      outputStream.write(out.toByteArray());//创建一个与out大小相同的的新分配的缓存区(必须是ByteArrayOutputStream字节数组输出流之间的转换)
      
      //将流文件读取值临时文件中
      while((readLength = in.read(buffer)) > 0){
        byte[] bytes = new byte[readLenght];
        System.arraycopy(buffer,0,bytes,0,readLength);
        out.write(bytes);
      }
      out.flush();
      logger.info("\r\n-----文件读取成功------\r\n");
    }catch(Exception e){
      e.printStackTrace();
    }finally{
      try{
        if(out != null){
          out.close();
        }
      }catch(IOException e){
        e.printStackTrace();
      }
      
      try{
        if(in != null){
          in.close();
        }
      }catch(IOException e){
        e.printStackTrace();
      }       if(httpUrlConnection !=null){
        httpUrlConnection.disconnect();
        logger.info("\r\n------通讯关闭------\r\n");
      }
    }
  
  }
}

Java通过Http请求服务器的更多相关文章

  1. Java获取此次请求URL以及服务器根路径的方法

    http://www.jb51.net/article/71693.htm ********************************************** 本文介绍了Java获取此次请求 ...

  2. Java发送Http请求并获取状态码

    通过Java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断. try { URL u = new URL("http://10.1.2.8:8080/fqz/page ...

  3. Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端

    Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端 本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子 ...

  4. java 实现https请求

    java 实现https请求 JSSE是一个SSL和TLS的纯Java实现,通过JSSE可以很容易地编程实现对HTTPS站点的访问.但是,如果该站点的证书未经权威机构的验证,JSSE将拒绝信任该证书从 ...

  5. 第三篇 :微信公众平台开发实战Java版之请求消息,响应消息以及事件消息类的封装

    微信服务器和第三方服务器之间究竟是通过什么方式进行对话的? 下面,我们先看下图: 其实我们可以简单的理解: (1)首先,用户向微信服务器发送消息: (2)微信服务器接收到用户的消息处理之后,通过开发者 ...

  6. 深入浅出Java 重定向和请求转发的区别

    深入浅出Java 重定向和请求转发的区别 <span style="font-family:FangSong_GB2312;font-size:18px;">impor ...

  7. HttpClient请求服务器代码优化版

    HttpClient请求服务器代码优化版 首先,我在前面的两篇博文中介绍了在 Android中,除了使用java.net包下HttpUrlConnection的API访问HTTP服务之外,我们还可以换 ...

  8. Java HttpClient伪造请求之简易封装满足HTTP以及HTTPS请求

    HttpClient简介 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 jav ...

  9. Android使用HttpUrlConnection请求服务器发送数据详解

    HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...

随机推荐

  1. Vue2.0 【第二季】第6节 Component 初识组件

    目录 Vue2.0 [第二季]第6节 Component 初识组件 第6节 Component 初识组件 一.全局化注册组件 二.局部注册组件局部 三.组件和指令的区别 Vue2.0 [第二季]第6节 ...

  2. 【摩天大楼平地起】基础篇 09 简述N种查找算法

    引言 在开始之前首先可以先思考一下假如没有查找算法会是什么情况?所有数据结构都需要全部遍历一遍,每次都一遍又一遍的查,从本质而言查找算法就是为了提高效率. 经过前人一代又一代的努力,目前的查找算法大致 ...

  3. Geotools在shapefile路网数据中建立缓冲区,并获取缓冲区内的要素

    记录一下如何创建创建缓冲区并获取缓冲区内的要素,便于以后查找使用 static SimpleFeatureSource featureSource = null; static CoordinateR ...

  4. Ansible Ad-Hoc与常用模块

    ansible 执行结果信息–各颜色说明:ansible Ad-Hoc 说明:ansible 如何查看帮助文档与常用模块详解 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有 ...

  5. jQuery万能放大镜插件(普通矩形放大镜)

    插件链接:http://files.cnblogs.com/files/whosMeya/magnifier.js 1.在jquery下插入. 2.格式:magnifier("需要插入的位置 ...

  6. 快速排序--15--快排--LeetCode排序数组

    排序数组 给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] ...

  7. fastjson JSONObject.toJSONString 出现 $ref: "$."的解决办法(重复引用)

    首先,fastjson作为一款序列化引擎,不可避免的会遇到循环引用的问题,为了避免StackOverflowError异常,fastjson会对引用进行检测. 如果检测到存在重复/循环引用的情况,fa ...

  8. 《面试经典系列》- 从底层理解==和equals的区别

    前言 在我们Java面试中,基础知识基本上比定会考核的点,而“==和equals的区别”则是面试官最喜欢.最经常问的问题. 但我们看了不少的文章.解释,总是一头雾水.一知半解的,往往很容忘记.今天,我 ...

  9. HTML,CSS,JavaScript,json,xml之间的关系

    1.浏览器工作原理: https://blog.csdn.net/Luncles/article/details/80320082 2.HTML,XML,JSON之间的关系: https://blog ...

  10. 【转】Java JDBC对应C# ADO连接数据库之区别

    JDBC对应C#连接数据库之区别 之前一直在用java,最近因为找了.NET的工作,开始学习.NET. 今天也是查了好多资料,但是一直没有看到和JDBC之间的对比博文,开始也是一头雾水! 但是功夫不负 ...