当前位置: 首页 > 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. 响应处理

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

相关文章:

  • 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实现在镜子间反射光柱
  • 仿糗事百科网站源码dede二次开发分享+评论+互动/网站不收录怎么办
  • 绵阳 网站开发/营销软文200字
  • 临朐网站建设咨询/厦门网
  • 请人做网站需要注意什么条件/seo网络搜索引擎优化
  • 河北 政府网站建设管理/给公司做网站要多少钱
  • 网站是否wordpress/餐饮培训