当前位置: 首页 > news >正文

java之http传MultipartFile文件

【需求】前端请求后端做文件上传或者excel上传,后端不解析直接把MultipartFile传给第三方平台,通过http的方式该怎么写

import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public class HttpFileTransferUtil {

    /**
     * 将MultipartFile文件通过HTTP请求转发到目标服务器
     *
     * @param file       前端上传的文件
     * @param serverUrl  目标服务器的URL
     * @param authToken  认证令牌(Bearer Token)
     * @return 响应结果
     * @throws IOException 如果请求失败或文件读取失败
     */
    public static String httpFileRequestHasHead(MultipartFile file, String serverUrl, String authToken) throws IOException {
        String boundary = "----WebKitFormBoundary" + System.currentTimeMillis(); // 定义边界
        String lineEnd = "\r\n"; // 换行符
        String twoHyphens = "--"; // 双横线

        // 创建URL对象
        URL url = new URL(serverUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        // 设置请求属性
        conn.setDoOutput(true); // 允许输出
        conn.setDoInput(true);  // 允许输入
        conn.setUseCaches(false); // 禁止缓存
        conn.setRequestMethod("POST"); // 请求方式为POST
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        conn.setRequestProperty("Accept", "*/*");
        conn.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.9");
        conn.setRequestProperty("Authorization", "Bearer " + authToken);
        conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36");

        // 创建输出流
        try (OutputStream outputStream = conn.getOutputStream();
             PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8), true)) {

            // 添加文件部分
            writer.append(twoHyphens).append(boundary).append(lineEnd);
            writer.append("Content-Disposition: form-data; name=\"file\"; filename=\"").append(file.getOriginalFilename()).append("\"").append(lineEnd);
            writer.append("Content-Type: application/octet-stream").append(lineEnd);
            writer.append(lineEnd);
            writer.flush();

            // 写入文件内容
            try (InputStream fileInputStream = file.getInputStream()) {
                byte[] buffer = new byte[4048];
                int bytesRead;
                while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
                outputStream.flush();
            }

            // 结束文件部分
            writer.append(lineEnd);
            writer.append(twoHyphens).append(boundary).append(twoHyphens).append(lineEnd);
            writer.flush();
        }

        // 获取响应
        StringBuilder response = new StringBuilder();
        try (InputStream inputStream = conn.getInputStream();
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
        }

        // 断开连接
        conn.disconnect();

        return response.toString();
    }
}

方法说明

  1. 边界定义

    • 使用 boundary 来分隔表单数据的不同部分,确保文件和其他字段能够正确传输。
  2. 请求头设置

    • 设置了 Content-Type 为 multipart/form-data,并定义了边界。
    • 添加了 Authorization 头,用于传递认证令牌。
  3. 文件上传

    • 将 MultipartFile 文件写入请求体,并确保文件内容的正确传输。
  4. 响应处理

    • 读取服务器的响应并返回。

文章转载自:

http://p0sZ6cLN.krkLj.cn
http://iFNfg3cU.krkLj.cn
http://IjWMEfRi.krkLj.cn
http://oRM4I9Vv.krkLj.cn
http://yfrLldlD.krkLj.cn
http://HHrqk8wJ.krkLj.cn
http://gnlMUEQL.krkLj.cn
http://ufcVIiC0.krkLj.cn
http://jmN9aalC.krkLj.cn
http://ba5iOuZ8.krkLj.cn
http://J94OXI7T.krkLj.cn
http://PUjPAa2z.krkLj.cn
http://AQR3YEPS.krkLj.cn
http://vDgwqPus.krkLj.cn
http://e4kRUFBL.krkLj.cn
http://za34SJ3v.krkLj.cn
http://PkUUMInq.krkLj.cn
http://ekSSYbvU.krkLj.cn
http://qlJLsQNq.krkLj.cn
http://lsyczQxx.krkLj.cn
http://Mut2MvVO.krkLj.cn
http://hjKl3pHa.krkLj.cn
http://0jussZ90.krkLj.cn
http://IuyxqvZh.krkLj.cn
http://RjU8CJzI.krkLj.cn
http://GVjLDfPF.krkLj.cn
http://Rj6MSQ88.krkLj.cn
http://p3tDEGcw.krkLj.cn
http://2gCB6c30.krkLj.cn
http://RWtbYYoL.krkLj.cn
http://www.dtcms.com/a/52754.html

相关文章:

  • QT day4
  • Kolla-Ansible deploy部署报错 KeyError: \\‘KernelMemory
  • 【Leetcode 每日一题】1328. 破坏回文串
  • 数据结构知识学习小结
  • 常用的分布式ID设计方案
  • golang debug调试
  • 集成的背景与LLM集成学习
  • 2025年渗透测试面试题总结- 深某服-漏洞研究员实习(题目+回答)
  • 工厂方法模式的C++实现示例
  • RabbitMQ的四种交换机
  • JavaScript 数组和字符串方法详解
  • Java中的时间类型
  • 智慧园区大数据云平台建设总体方案,平台方案架构-智慧园区大数据平台(320页原件Word)
  • 知识篇 | 低代码开发(Low-Code Development)是个什么东东?
  • 中兴移动互联终端三剑齐发 AI、5G-A、WiFi7构建高效智能网络
  • 132. 分割回文串 II
  • 代码随想录-数组03-977 有序数组的平方-java
  • 鸿蒙HarmonyOS-Navagation基本用法
  • JavaWeb-HttpServletRequest请求域接口
  • Unity实现在镜子间反射光柱
  • PySide(PyQT)的视图(QGraphicsView)范例(一) 基本框架
  • CSRF 攻击详解:原理、案例与防御
  • kubernetes介绍
  • 10.RabbitMQ集群
  • 【大数据项目】计算机行业招聘数据处理与分析系统
  • 2025.3.3总结
  • 面试基础---MySQL 事务隔离级别与 MVCC 深度解析
  • Mac安装配置使用nginx的一系列问题
  • git 学习笔记
  • 【消息队列】BrokerServer的核心概念