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

 更新时间:2024年01月02日 09:59:34   作者:代号:猿a  
这篇文章主要介绍了RestTemplate发送form-data请求上传rul资源文件及对象参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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

需求

上传文件服务中的文件到其他平台

  • 接口描述:用于上传工程日志相关资料
  • 请求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);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • 基于redis key占用内存量分析

    基于redis key占用内存量分析

    这篇文章主要介绍了基于redis key占用内存量分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • MyBatis无缝转MyBatis-plus的基本使用

    MyBatis无缝转MyBatis-plus的基本使用

    本文介绍了使用MyBatis-plus来优化MyBatis的使用,包括引入依赖、改造Mapper、实体类注解使用、Service层方法改造等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • Java Timer使用讲解

    Java Timer使用讲解

    Timer是一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,这篇文章主要介绍了Java Timer使用讲解,需要的朋友可以参考下
    2022-11-11
  • spring cloud学习入门之config配置教程

    spring cloud学习入门之config配置教程

    这篇文章主要给大家介绍了关于spring cloud学习入门之config配置的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring cloud具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • Java实现每日给女友微信发送早安信息

    Java实现每日给女友微信发送早安信息

    这篇文章主要为大家详细介绍了Java如何实现每日给女友微信发送早安等微信信息,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2022-12-12
  • Java Map如何根据key取value以及不指定key取出所有的value

    Java Map如何根据key取value以及不指定key取出所有的value

    这篇文章主要介绍了Java Map如何根据key取value以及不指定key取出所有的value,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 深度剖析java动态静态代理原理源码

    深度剖析java动态静态代理原理源码

    这篇文章主要介绍了深度剖析java动态静态代理原理源码,关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理。,需要的朋友可以参考下
    2019-06-06
  • Java操作Zookeeper原理及过程详解

    Java操作Zookeeper原理及过程详解

    这篇文章主要介绍了Java操作Zookeeper原理及过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java中List集合去重方法以及效率对比

    Java中List集合去重方法以及效率对比

    这篇文章主要给大家介绍了关于Java中List集合去重方法以及效率对比的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java如何基于IO流实现同一文件读写操作

    Java如何基于IO流实现同一文件读写操作

    这篇文章主要介绍了Java如何基于IO流实现文件读写操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10

最新评论