HttpClient请求,同时带文件MultipartFile类型和普通数据类型(application/json)上传与下载

访问一个上传图片的接口,给出了url和参数类型:
URL:xxxxxx

参数名 类型 描述
token String 标记
file MultipartFile 待上传的文件
name String 文件名

理论中的返回值是个JSON:

参数名 类型 描述
result String 错误码,1成功,其他失败
message String 描述信息
url String 文件的uri

上传文件接口需要两种参数,MultipartFile文件类型参数和String类型参数。HTTP基础中,HTTP请求分为了消息头和消息体,头信息里面的Content-Type字段定义了消息体的请求格式,SpringMvc是按照请求头来解析消息内容的。
文件的请求头必须是multipart/form-data,而普通数据类型这里定为application/json。

构造两个ContentType,文件用文件流传输,请求头为multipart/form-data;
普通数据类型用字节流传输,请求头为application/json;
构造完放入放入一个httpEntity实例中发起请求

核心代码如下:

		//把File类型转换为 MultipartFile类型
		File file = new File(Path);
        FileInputStream fileInputStream = new FileInputStream(file);
        MultipartFile multipartFile = new MockMultipartFile(file.getPath(), file.getName(),APPLICATION_OCTET_STREAM.toString(), fileInputStream);

		//上传图片请求
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(URL);//这里填写请求的URL
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.setCharset(StandardCharsets.UTF_8);
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        //文件传输http请求头(multipart/form-data)
        builder.addBinaryBody("file", multipartFile.getInputStream(), ContentType.MULTIPART_FORM_DATA,
                multipartFile.getOriginalFilename()); // 文件流
        //字节传输http请求头(application/json)
        ContentType contentType = ContentType.create("application/json", StandardCharsets.UTF_8);
        builder.addTextBody("token", TOKEN, contentType); //字节流
        builder.addTextBody("name", fileName, contentType); //字节流
        HttpEntity entity = builder.build();
        httpPost.setEntity(entity);
        HttpResponse response = httpClient.execute(httpPost);
        //执行提交
        HttpEntity responseEntity = response.getEntity();
        String result = "";
        if (responseEntity != null) {
            //将响应内容转换为字符串
            result = EntityUtils.toString(responseEntity, StandardCharsets.UTF_8);
        }
        //转换成map
        Map<String, Object> map = ObjectMapperUtils.fromJson(result);
		//得到下载文件的URL
        String url = (String) map.get("url");

参考博客:
springboot进行httpclient接口请求,请求带文件MultipartFile和普通数据类型的解决方案

你可能感兴趣的:(后端)