不在本地生成文件的情况下,从网络获取文件并发送到另一个服务器~⁽(◍˃̵͈̑ᴗ˂̵͈̑)⁽

前言(。•ᴗ-)_

最近项目忙的头晕眼花
几篇博客都难产了
今天老大丢给我一个文档说让我对接一下另一个公司的系统
在这里插入图片描述
没办法咯,要恰饭的嘛,搞~(˘͈ᵕ ˘͈❀)
但是在对接过程中发现一个问题第三方需要一个文件流
而不是一个URL路径
接收一个路径不香吗
非要一个流
在这里插入图片描述

开始操作了鸭(。•ᴗ-)_

首先我们拿到的也是一个URL,也就是说我们需要把这个URL转为一个输入流

我并不想在本地生成一个文件,再上传过去,这样并发的话硬盘IO根本顶不住,所以我选择在内存中完成这个操作

/**
     * 获取网络文件流
     *
     * @param url
     * @return
     */
    public static InputStream getImageStream(String url) {
        try {
            //打开连接
            HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
            //设置超时时间
            connection.setReadTimeout(5000);
            connection.setConnectTimeout(5000);
            //请求方式GET
            connection.setRequestMethod("GET");
            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                //从连接获取输入流
                InputStream inputStream = connection.getInputStream();
                return inputStream;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

流是拿到了,现在构建一个文件

在内存中操作文件有一个非常好用的类MultipleFile

但是MultipleFile不能直接实例化…(╹⚇╹?)
在这里插入图片描述
但是他有一个实现类~(͏ ˉ ꈊ ˉ)✧˖°
在这里插入图片描述
直接使用实现类来操作就好了嘛~(⑅˃◡˂⑅)

InputStream inputStream = getImageStream("https://img-blog.csdnimg.cn/20200728165236752.png");

MultipartFile file = new MockMultipartFile("苏玛利.jpg", inputStream);

使用RestTemplate来发送请求~(。・ω・。)つ━☆

		//转换
        InputStream inputStream = getImageStream("https://img-blog.csdnimg.cn/20200728164802647.png");
        MultipartFile file = new MockMultipartFile("苏玛利.jpg", inputStream);
        //请求地址
        String url = "www.baidu.com";
        //拼接参数
        LinkedMultiValueMap<Object, Object> params = new LinkedMultiValueMap<>();
        //不能直接发送对象,需要转换一次
        ByteArrayResource byteArrayResource = new ByteArrayResource(file.getBytes());
        params.add("contractModelAttach",byteArrayResource);
        //设置请求头
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
        //设置请求实体
        HttpEntity<LinkedMultiValueMap<Object, Object>> httpEntity = new HttpEntity<>(params, httpHeaders);
        //发送请求
        String result = restTemplate.postForObject(url, httpEntity, String.class);
        System.out.println("result = " + result);

你们以为这样就结束了吗!那就大错特错了!
这样发送请求服务器并收不到文件
至于怎么操作呢,你们自己百度哦~ԅ(¯﹃¯ԅ)
在这里插入图片描述
错了错了,现在就讲,不要凶我( •̥́ ˍ •̀ू )
在这里插入图片描述

踩坑坑(ง ˙o˙)ว

因为是字节流直接传输过去,服务器获取不到文件名,所以需要给文件起个名字

		//转换
        InputStream inputStream = getImageStream("https://img-blog.csdnimg.cn/20200728164802647.png");
        MultipartFile file = new MockMultipartFile("苏玛利.jpg", inputStream);
        //请求地址
        String url = "www.baidu.com";
        //拼接参数
        LinkedMultiValueMap<Object, Object> params = new LinkedMultiValueMap<>();
        //不能直接发送对象,需要转换一次
        //重写getFilename方法
        ByteArrayResource byteArrayResource = new ByteArrayResource(file.getBytes()){
            @Override
            public String getFilename() throws IllegalStateException {
                return file.getName();
            }
        };
        params.add("contractModelAttach",byteArrayResource);
        //设置请求头
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
        //设置请求实体
        HttpEntity<LinkedMultiValueMap<Object, Object>> httpEntity = new HttpEntity<>(params, httpHeaders);
        //发送请求
        String result = restTemplate.postForObject(url, httpEntity, String.class);
        System.out.println("result = " + result);

这样就可以成功的不在本地保存文件的情况下,把文件传输给给另一个服务器了~( ๑╹ ꇴ╹) グッ!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值