java之http传MultipartFile文件

发布于:2025-03-06 ⋅ 阅读:(14) ⋅ 点赞:(0)

【需求】前端请求后端做文件上传或者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. 响应处理

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