Java-Http-请求服务器

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(" ------图片下载接口开始调用------ ");
    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(" ------临时文件已删除------ ");
      }
      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(" -----文件读取成功------ ");
    }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(" ------通讯关闭------ ");
      }
    }
  
  }
}
往外张望的人在做梦,向内审视的人才是清醒的
原文地址:https://www.cnblogs.com/StefanieYang/p/12201703.html