文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JAVA 接口文件传参 & 接收文件; 接口接收文件流(主打的就是无脑)

2023-08-31 09:18

关注

有这么一个业务场景: 系统A 把文件传送到 系统B 系统B对文件进行处理(加水印or保存...)系系统B 把处理完的文件返回给系统A 系统A进行保存备份。

编写了两个类  sendFile(系统A)  ReceiveFileController(系统B)采用 httpClient 进行接口调用 ,系统B 把回传的文件写在 response的流里。话不多说,上代码

系统A:

POM文件

                    org.apache.httpcomponents            httpmime            4.5                            org.apache.httpcomponents            httpclient            4.5        

调用接口 发送文件 接收返回的文件流保存文件

package com.example.File;import org.apache.http.Consts;import org.apache.http.HttpEntity;import org.apache.http.client.config.RequestConfig;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpPost;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.entity.ContentType;import org.apache.http.entity.mime.HttpMultipartMode;import org.apache.http.entity.mime.MultipartEntityBuilder;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import java.io.*;import java.nio.file.Files;import java.security.KeyManagementException;import java.security.NoSuchAlgorithmException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;public class sendFile {    public static void main(String[] args) {        doPostFile2("https://.../receiveFile/test","userid",new File("D:\\1.jpg"),"D:\\2.jpg");    }        public static void doPostFile2(String url, String param, File file,String downloadPath) {        CloseableHttpClient httpClient = HttpClients.createDefault();        // https   需要SSL        if (url.startsWith("https://")) {            httpClient = sslClient();        }        String resultString = "";        CloseableHttpResponse response = null;        HttpPost httppost = new HttpPost(url);        //返回的字节流        byte[] bytes = null;        try {            // HttpMultipartMode.RFC6532    避免文件名为中文时乱码            MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);            builder.setCharset(Consts.UTF_8);            builder.setContentType(ContentType.MULTIPART_FORM_DATA);            //或者使用字节流也行,根据具体需要使用            builder.addBinaryBody("file", Files.readAllBytes(file.toPath()),ContentType.APPLICATION_OCTET_STREAM,file.getName());            // 添加参数 addTextBody的key可以自定义和被调接口的入参保持一直    可多个addTextBody     key不一样即可  需在接收方接收            builder.addTextBody("param", param);            //builder.addTextBody("key1", param);            //可以设置 请求头            //httppost.addHeader("token", param.get("token"));            HttpEntity reqEntity = builder.build();            httppost.setEntity(reqEntity);            // 设置超时时间            httppost.setConfig(getConfig());            response = httpClient.execute(httppost);            //我这里  调用接口返的字节流  所以获取字节数组            //resultString = EntityUtils.toString(response.getEntity(), "UTF-8");            HttpEntity entity = response.getEntity();            //输出流 字节数组            bytes = EntityUtils.toByteArray(entity);        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                response.close();            } catch (IOException e) {                e.printStackTrace();            }        }        InputStream inputStream = new ByteArrayInputStream(bytes);        OutputStream outputStream = null;        try {            // todo下载的目录不存在需要创建            byte[] bs = new byte[1024];            int len;            outputStream = new FileOutputStream(downloadPath);            while ((len = inputStream.read(bs)) != -1) {                outputStream.write(bs, 0, len);            }        } catch (Exception e) {            throw new RuntimeException("照片处理失败:" + e);        } finally {            try {                outputStream.close();                inputStream.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }    //超时时间;    private static RequestConfig getConfig() {        return RequestConfig.custom().setConnectionRequestTimeout(50000).setSocketTimeout(150000)                .setConnectTimeout(50000).build();    }        private static CloseableHttpClient sslClient() {        try {            SSLContext ctx = SSLContext.getInstance("TLS");            X509TrustManager tm = new X509TrustManager() {                @Override                public void checkClientTrusted(java.security.cert.X509Certificate[] arg0, String arg1)                        throws CertificateException {}                @Override                public void checkServerTrusted(java.security.cert.X509Certificate[] arg0, String arg1)                        throws CertificateException {}                @Override                public X509Certificate[] getAcceptedIssuers() {                    return null;                }            };            ctx.init(null, new TrustManager[] { tm }, null);            SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactory.getSocketFactory();            return HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build();        } catch (NoSuchAlgorithmException e) {            throw new RuntimeException(e);        } catch (KeyManagementException e) {            throw new RuntimeException(e);        }    }}

系统B

package com.example.File;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;@RestController@RequestMapping(value = "/receiveFile")public class ReceiveFileController {    @PostMapping("/test")    public void receiveFile(@RequestParam("file")MultipartFile file, @RequestParam("param")String param, HttpServletResponse response){        try {            //拿到文件流            InputStream inputStream = file.getInputStream();            //todo开始处理业务            //处理完的文件放在 response中            OutputStream outputStream = response.getOutputStream();            //todo 把处理的东西写在  outputStream即可        } catch (IOException e) {            e.printStackTrace();        }    }}

来源地址:https://blog.csdn.net/weixin_45177751/article/details/129861591

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯