java通过Http请求访问网络图片或文件返回byte数组的两种方式

第一种方式,使用HttpURLConnection

使用HttpURlConnection发送一个get请求,打开一个连接,从连接获取到流,将流转成byte数组


/**
   * 发起Get请求
   *
   * @param urlStr
   * @return
   */
  public final static byte[] doGetRequestForFile(String urlStr) {

    InputStream is = null;
    ByteArrayOutputStream os = null;
    byte[] buff = new byte[1024];
    int len = 0;
    try {
      URL url = new URL(UriUtils.encodePath(urlStr, DEFAULT_CHARSET));
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setRequestProperty("Content-Type", "plain/text;charset=" + DEFAULT_CHARSET);
      conn.setRequestProperty("charset", DEFAULT_CHARSET);
      conn.setDoInput(true);
      conn.setDoOutput(true);
      conn.setRequestMethod("GET");
      conn.setReadTimeout(DEFAULT_TIME_OUT);
      conn.connect();
      is = conn.getInputStream();
      os = new ByteArrayOutputStream();
      while ((len = is.read(buff)) != -1) {
        os.write(buff, 0, len);
      }
      return os.toByteArray();
    } catch (IOException e) {
      log.error("发起请求出现异常:", e);
       return null;
    } finally {
      if (is != null) {
        try {
          is.close();
        } catch (IOException e) {
          log.error("【关闭流异常】");
        }
      }
      if (os != null) {
        try {
          os.close();
        } catch (IOException e) {
          log.error("【关闭流异常】");
        }
      }
    }
    return result;
  }

引入的类:


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

 第二种,使用OkHttpClient发送get请求

使用OkHttpClient直接模拟request请求和response

public final static byte[] sendGetForFile(String url) {
    InputStream inputStream = null;
    Request req = (new Request.Builder()).url(url).get().build();
    Response response = null;
    try {
      response = new OkHttpClient().newCall(req).execute();
      if (!response.isSuccessful()) {
        log.error("【调用HTTP请求异常】 code:{},message:{}", response.code(), response.message());
        return null;
      }

      inputStream = response.body().byteStream();
      return inputToByte(inputStream);
    } catch (IOException e) {
      log.error("发起请求出现异常:", e);
      return null;
    } finally {
      try {
        inputStream.close();
      } catch (IOException var12) {
        log.error("【关闭流异常】");
      }
    }
    return result;
  }

inputToByte方法:

/**
   * 流转byte数组
   *
   * @param inputStream
   * @return
   * @throws IOException
   */
  private static byte[] inputToByte(InputStream inputStream) throws IOException {
    ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
    byte[] buff = new byte[1024];
    int rc;
    while ((rc = inputStream.read(buff, 0, 1024)) > 0) {
      swapStream.write(buff, 0, rc);
    }
    byte[] in2b = swapStream.toByteArray();
    return in2b;
  }

OkHttpClient发送post请求

public static byte sendPostForFile(String url, String json) {

    InputStream inputStream = null;

    try {
      RequestBody requestBody = RequestBody.create(JSON, json);
      Request request = (new Builder()).url(url).post(requestBody).build();

      Response response =  new OkHttpClient().newCall(request).execute() ;
      if (!response.isSuccessful()) {
        log.error("【调用HTTP请求异常】 code:{},message:{}", response.code(), response.message());
        return null;
      }

      inputStream = response.body().byteStream();
      return inputToByte(inputStream);

    } catch (IOException var13) {
      logger.error("【post请求异常】", var13);
      return null;
    } finally {
      try {
        inputStream.close();
      } catch (IOException var12) {
        log.error("【关闭流异常】");
      }

    }

    return result;
  }
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
是的,Java可以处理流(stream)的方式上传文件Java中常用的处理流的方式两种:一种是使用Apache Commons FileUpload组件,另一种是使用Servlet 3.0规范中新增的Part接口。下面分别介绍这两种方式的使用方法。 1. 使用Apache Commons FileUpload组件 Apache Commons FileUpload是一个用于处理HTTP请求中上传文件的开源组件,使用它可以方便地处理文件上传。具体步骤如下: - 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> ``` - 在Controller中处理文件上传请求,例如: ``` @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file) throws IOException { if (!file.isEmpty()) { byte[] bytes = file.getBytes(); // 处理文件上传逻辑 return "上传成功!"; } else { return "上传失败!"; } } ``` 其中,@RequestParam注解用于获取请求参数,MultipartFile类型表示上传的文件,getBytes()方法可以将文件内容读取到内存中并返回一个字节数组。 2. 使用Servlet 3.0规范中新增的Part接口 Servlet 3.0规范中新增了Part接口,可以方便地处理文件上传。具体步骤如下: - 在Controller中处理文件上传请求,例如: ``` @PostMapping("/upload") public String handleFileUpload(HttpServletRequest request) throws IOException, ServletException { Collection<Part> parts = request.getParts(); for (Part part : parts) { String fileName = part.getSubmittedFileName(); InputStream inputStream = part.getInputStream(); // 处理文件上传逻辑 } return "上传成功!"; } ``` 其中,HttpServletRequest对象表示HTTP请求对象,getParts()方法可以获取所有的Part对象,getSubmittedFileName()方法可以获取上传文件文件名,getInputStream()方法可以获取上传文件的内容的输入流。 需要注意的是,使用流的方式上传文件可以避免将文件内容读取到内存中,从而减少内存占用,但是会增加代码的复杂度和维护成本。因此,在选择上传文件方式时,需要根据具体情况进行权衡。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值