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

这篇具有很好参考价值的文章主要介绍了JAVA 接口文件传参 & 接收文件; 接口接收文件流(主打的就是无脑)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

系统A:

1.POM文件

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5</version>
        </dependency>

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

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;

/**
 * @Cimpany yuJ.wang
 * @ClassName: sendFile
 * @Description: 发送文件
 * @Date: 2023/3/30 16:24
 * @Author: 老王头
 */
public class sendFile {


    public static void main(String[] args) {
        doPostFile2("https://.../receiveFile/test","userid",new File("D:\\1.jpg"),"D:\\2.jpg");
    }

    /**
    * @Description:   httpClient调用接口传送文件  接收文件流保存本地
    * * @Param url:  接口地址
     * @Param param: 参数值
     * @Param file: 文件
     * @Param downloadPath: 保存地址
    * @return: void
    * @Author: laoWangTou
    * @Date: 2023/3/30
    */
    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();
    }

    /**
     * HTTPS   设置SSL请求处理
     */
    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文章来源地址https://www.toymoban.com/news/detail-560457.html

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;

/**
 * @Cimpany yuJ.wang
 * @ClassName: receiveFile
 * @Description: 接收文件
 * @Date: 2023/3/30 16:24
 * @Author: 老王头
 */
@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();
        }

    }

}

到了这里,关于JAVA 接口文件传参 & 接收文件; 接口接收文件流(主打的就是无脑)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java_web接收前端传的excel文件读取数据

    #本次做一个将患者数据导入到某个模块的功能,前期集成的代码时不时出现异常,本次进行修改记录 前端代码

    2024年02月04日
    浏览(41)
  • vue3上传多个文件并携带参数一起上传,后台java接收

    直接上代码 vue代码 上传文件组件,采用element-plus 这里采用的是手动上传,选取文件后,点击保存才会触发上传操作 这个地方如果不添加.raw  可以看到这个files是个[object Object] 同样它传入后台是个String类型 你用MultipartFile[]来接收这个String类型的 “[object Object]” 这肯定不行

    2024年02月13日
    浏览(33)
  • 【Java 线程系列】Java 天生就是多线程

    作者:半身风雪 上一篇:线程之间的共享和协作

    2024年02月05日
    浏览(39)
  • Java Websocket发送文件给Vue客户端接收并上传,实现检测U盘插入并将指定文件上传到服务器功能

    应用环境: B/S架构 需求描述: 1、判断U盘接入 2、扫描U盘指定文件,将满足条件的文件发送给服务器 解决思路: 1、因为bs架构,无法获取本机资源,计划在U盘所在服务器部署websocket服务 2、websocket服务扫描u盘,拿到指定文件,使用session.getBasicRemote().sendBinary(data)分批发送二

    2024年01月15日
    浏览(50)
  • Java通过接口返回文件流

    在返回接口的,如果包含文件,一般有两种返回方式:     1.返回文件在服务器中的地址     2.读取文件在服务器中的地址,并将文件以流的方式返回 对于第一种方式,返回文件在服务器中的真实地址,存在一定的安全隐患 对于第二种方式,返回文件流,并不会暴露文件

    2024年02月11日
    浏览(29)
  • 后端接收文件类型的接口(MultipartFile)接收

    使用java,springboot接收 MultipartFile文件类型的接口 file一般接口中使用MultipartFile类型接收 Controller层:参数编写 思路:以.json文件举例 先将MultipartFile转化为file格式,然后再将file格式文件通过流进行解析成string 直接上转化的代码 获取到json字符串之后,通过JSONObject将json转化为

    2024年01月15日
    浏览(32)
  • 不就是Java吗之 认识异常

    大家好 , Java 专栏本应该早就完成的 但是之前发表异常的文章的时候 , 超过当天发布文章限制了 所以那时候就没上传成功 , 真的深感抱歉 刚才发现竟然少文章了 另外祝大家新年快乐 大年初七别忘了吃面条 在计算机程序运行的过程中,总是会出现各种各样的错误。 在 Java 中

    2024年01月23日
    浏览(40)
  • java http远程调用接口下载文件

    远程调用http接口下载文件,接口返回流 一、将文件保存本地 二、将接收到流直接返回

    2024年02月14日
    浏览(35)
  • axios同一个接口,同时接收 文件 或者 数据

    1、前端代码  主要是: if (response.data instanceof Blob)  判断是否是 Blob 对象, 否则使用: response.data = JSON.parse(await (response.data).text()) 将后台返回的内容转成 文本 返回 主要是: responseType: \\\'blob\\\' 2、后端代码 需要注意的是: response.setHeader(\\\"Access-Control-Expose-Headers\\\", \\\"filename\\\"); 否则

    2024年02月12日
    浏览(36)
  • 【Java从入门到精通】这也许就是Java火热的原因吧!

    前言: Java是一种高级的、面向对象的、可跨平台的程序设计语言。 Java根据技术类别可划分为以下几类:JavaSE(Standard Edition,标准版):支持面向桌面、嵌入式和移动设备的应用程序开发;JavaEE(Enterprise Edition,企业版):支持基于Web的大型企业应用程序开发;JavaME(Mobi

    2024年02月08日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包