• 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(" ------通讯关闭------ ");
          }
        }
      
      }
    }
    往外张望的人在做梦,向内审视的人才是清醒的
  • 相关阅读:
    HTTP 的学习
    标量方程求解
    限制器
    差分格式
    Archlinux的基本配置
    布拉休斯方程数值求解
    GNU大型项目构建和覆盖率生成(第一篇)
    plot3d网格读取写入与可视化
    abaqus中的约束
    向量范数和矩阵范数
  • 原文地址:https://www.cnblogs.com/StefanieYang/p/12201703.html
Copyright © 2020-2023  润新知