RestTemplate发送form-data请求上传url资源文件及对象参数

需求

上传文件服务中的文件到其他平台
接口描述:用于上传工程日志相关资料
请求url:/cq-szh-projectdocumentscomputesvc/api/service/addEngineerLog
请求方式:POST
请求类型:form/data
请求参数:包含对象参数 和 多个文件参数
其中recordPerson和uploadPerson为对象参数,
files为List< MultipartFile >类型,
fileInfos为JSONArray参数

/**
     * 通过url获取文件资源
     * @param url
     * @param fileName
     * @return
     * @throws IOException
     */
    private static ByteArrayResource getResourceByUrl(String url,String fileName) throws IOException {
        // 通过url获取输入流
        InputStream inputStream = getFileInputStream(url);
        // 读取输入流到字节数组
        byte[] bytes = readBytes(inputStream);
        // 将自己数组转为文件资源
        return new ByteArrayResource(bytes) {
            @Override
            public String getFilename() {
                // 指定文件名称
                return fileName;
            }
        };
    }

    /*读取网络文件*/
    public static InputStream getFileInputStream(String path) {
        URL url = null;
        try {
            url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            //设置超时间为3秒
            conn.setConnectTimeout(3*1000);
            //防止屏蔽程序抓取而返回403错误
            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            //得到输入流
            return conn.getInputStream();
        } catch (Exception e) {
            logger.error("读取网络文件异常:"+path);
        }
        return null;
    }

    /**
     * 读取输入流到字节数组
     * @param in
     * @return
     * @throws IOException
     */
    public static byte[] readBytes(InputStream in) throws IOException {
        //读取字节的缓冲
        byte[] buffer = new byte[1024];
        //最终的数据
        byte[] result = new byte[0];
        int size = 0;
        while ((size = in.read(buffer)) != -1) {
            int oldLen = result.length;
            byte[] tmp = new byte[oldLen + size];
            if (oldLen > 0) {//copy 旧字节
                System.arraycopy(result, 0, tmp, 0, oldLen);
            }
            //copy 新字节
            System.arraycopy(buffer, 0, tmp, oldLen, size);

            result = tmp;
        }
        return result;
    }
/**
     * form-data的post 请求
     * @param params 请求参数
     * @param modelUrl 模块url
     * @return
     */
    public static JSONObject postFormData( MultiValueMap<String, Object> params, String modelUrl) {
        HttpHeaders headers = new HttpHeaders();
        headers.add("token", token);
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);


        //MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(params, headers);
        //String urlParams = url + "?params={json}";
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(urlHeader+modelUrl, httpEntity, String.class);

        //ResponseEntity<String> responseEntity = restTemplate.exchange(urlHeader+modelUrl, HttpMethod.POST, httpEntity, String.class);
        return JSON.parseObject(responseEntity.getBody());

    }
// 测试市工程项目数字化管理平台接口
		
        MultiValueMap<String, Object> params = new LinkedMultiValueMap<String, Object>();
        params.add("accessCode",accessCode);
        params.add("secretKey",secretKey);
        params.add("type","GC0019001");
        params.add("name","日志名称1");
        params.add("weather","天气");
        params.add("dairyDate",new Date());
        params.add("recordPerson",OperationInfo.builder().operator("张三").longitude("106.57").latitude("29.55").build());
        params.add("content","内容");
        params.add("uploadPerson",OperationInfo.builder().operator("张三").longitude("106.57").latitude("29.55").build());
        //FileSystemResource fileSystemResource = new FileSystemResource("D:/浏览器下载/图/test1.jpg");
        //FileSystemResource fileSystemResource = new FileSystemResource("http://192.168.5.91:9300/statics/project_61/safety/2021/12/22/cfc8b2e9-4536-44cb-a098-25cc6ed84e6b.jpg");
        //通过url获取文件资源
        ByteArrayResource contentsAsResource = getResourceByUrl("http://192.168.5.91:9300/statics/project_61/safety/2021/12/22/cfc8b2e9-4536-44cb-a098-25cc6ed84e6b.jpg","ces.jpg");
        params.add("files", contentsAsResource);
        List<FileInfo> fileInfos = new ArrayList<>();
        // 同上面指定的文件名
        fileInfos.add(FileInfo.builder().fileName("ces.jpg").documentType("GC0013001")
            .unitProjectId("dc77d2c538cb4491a4b6aea006f9e48f").documentDirectoryId("3015").build());
        params.add("fileInfos", JSONArray.parseArray(JSONObject.toJSONString(fileInfos)));

        JSONObject jsonObject = postFormData(params, "/cq-szh-projectdocumentscomputesvc/api/service/addEngineerLog");
        System.out.println(jsonObject);
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: resttemplate form-urlencoded与form-data是两种不同的请求参数传递方式。 相同点: 1. 都可以用于传递表单数据。 2. 都是HTTP请求中的Content-Type的一种类型。 3. 都可以通过RestTemplate进行发送。 不同点: 1. form-urlencoded参数传递方式是将参数编码成key-value的形式,并用&符号连接起来,然后将参数放在请求的body中发送。而form-data参数传递方式是将参数以各个part的形式传输,每个part包含一个key-value对。 2. 在form-urlencoded方式中,参数会被URL编码,而在form-data方式中,参数不会被编码,会保留其原始格式。 3. form-urlencoded方式在处理参数键值对时只支持字符串类型的值,而form-data方式可以支持多种数据类型的值,比如文件等。 4. 在RestTemplate中,form-urlencoded方式通常使用MultiValueMap<String, String>来存储参数,而form-data方式则使用LinkedMultiValueMap<String, Object>来存储参数。 选择使用哪种方式取决于具体的需求。如果只是传输简单的键值对参数,而且参数值为字符串类型,可以选择form-urlencoded方式。如果需要传输复杂的参数,比如文件等,或者参数值类型多样,可以选择form-data方式。 ### 回答2: RestTemplate是Spring框架提供的用于发送HTTP请求的类库。而form-urlencoded和form-data都是HTTP请求中常见的两种请求数据格式。 相同点: 1. 都是用于在HTTP请求中传递表单数据的格式。 2. 都是将数据以键值对的形式传递。 3. 都可以通过RestTemplate的方法进行发送。 不同点: 1. 数据编码方式不同:form-urlencoded使用URL编码对数据进行编码,而form-data使用多部分(Multipart)编码。form-urlencoding将特殊字符进行URL编码,例如空格会被编码为%20;form-data则将数据以二进制形式发送,不对特殊字符进行编码。 2. 传递文件的能力不同:form-urlencoded只能用于传递文本数据,无法传递文件;而form-data可以传递文本数据、二进制文件等多种类型的数据。 3. 请求头不同:form-urlencoded的Content-Type为"application/x-www-form-urlencoded",而form-data的Content-Type为"multipart/form-data"。 4. 数据传输方式不同:form-urlencoded将数据以键值对的形式编码到请求URL中的query string中,而form-data则将数据以多部分(Multipart)形式附加到请求的body中。 综上所述,form-urlencoded和form-data在数据编码方式、传递文件能力、请求头和数据传输方式等方面存在差异。在使用RestTemplate发送HTTP请求时,需要根据实际需求选择适合的数据格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值