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. (转)协议森林11 涅槃 (TCP重新发送)

    协议森林11 涅槃 (TCP重新发送) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! TCP协议是一个可靠的协议.它通过重新发送 ...

  2. What is the difference between shades and shadows?

    Shade is the darkness of an object not in direct light, while shadows are the silhouette of an objec ...

  3. webpack学习(一):webpack的安装和命令行

    本教程可以学习到如下内容: 1.webpack的安装 2.利用webpack命令打包js文件 3.如何在js文件里面引用css并将css文件在页面里面生效 4.学习webpack相关的高级的一些参数, ...

  4. linux下怎么找到某些命令出自于哪个包

    我们经常会遇到新装机器或者用别人的linux机器的时候找不到某个命令出自哪个软件包而不知道如何安装的情况,用如下命令可以解决 yum provides TARGET 举例说明: #要找到lsb-rel ...

  5. Webpack中SplitChunksPlugin 配置参数详解

    代码分割本身和 webpack 没有什么关系,但是由于使用 webpack 可以非常轻松地实现代码分割,所以提到代码分割首先就会想到使用 webopack 实现. 在 webpack 中是使用 Spl ...

  6. 认识Oracle数据库系统--详细解说

    1.3 认识Oracle数据库系统 Oracle数据库是美国Oracle公司的一款关系型数据库管理系统,简称为Oracle RDBMS,是目前数据库市场上最为强大和流行的数据库系统之一.Oracle是 ...

  7. [剑指offer]6.从尾到头打印链表+18.删除链表节点

    链表 6.从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 方法一 迭代 创建空列表res,将链表值head.val依次存进res,返回翻转后的res 代码 cl ...

  8. dvwa学习之七:SQL Injection

    1.Low级别 核心代码: <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; ...

  9. [模拟]Educational Codeforces Round 2A Extract Numbers

    Extract Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  10. 如何定时备份Mysql数据库

    1.创建备份数据库存储目录 cd data/db mkdir backup #创建存储目录 2.添加备份脚本 vim backupdb.sh #创建脚本文件 脚本内容如下: #!/bin/sh db_ ...