【需求】前端请求后端做文件上传或者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();
}
}
方法说明
边界定义:
- 使用
boundary
来分隔表单数据的不同部分,确保文件和其他字段能够正确传输。
- 使用
请求头设置:
- 设置了
Content-Type
为multipart/form-data
,并定义了边界。 - 添加了
Authorization
头,用于传递认证令牌。
- 设置了
文件上传:
- 将
MultipartFile
文件写入请求体,并确保文件内容的正确传输。
- 将
响应处理:
- 读取服务器的响应并返回。