如何在Java中实现指定的CURL Multipart上传请求?
把Multipart CURL请求转为Java代码的解决方案
嘿,我帮你把这段curl请求转换成Java代码,给你两种常用的实现方案,都是处理multipart/form-data上传的可靠方式:
方案一:使用Java 11+自带的HttpClient(无需额外依赖)
这个方案不需要引入第三方库,适合用标准Java环境的项目:
import java.io.File; import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.file.Path; public class MultipartUploadExample { public static void main(String[] args) throws IOException, InterruptedException { // 替换成你的实际token和文件路径 String authToken = "YOUR_AUTH_TOKEN_HERE"; File imageFile = new File("test.png"); // 构建multipart请求体 HttpRequest.BodyPublisher body = HttpRequest.BodyPublishers.ofMixed( HttpRequest.BodyPublishers.ofString("--boundary\r\nContent-Disposition: form-data; name=\"attached_file\"; filename=\"test.png\"\r\nContent-Type: image/png\r\n\r\n"), HttpRequest.BodyPublishers.ofFile(Path.of(imageFile.getAbsolutePath())), HttpRequest.BodyPublishers.ofString("\r\n--boundary\r\nContent-Disposition: form-data; name=\"from_comment\"\r\n\r\nFalse\r\n"), HttpRequest.BodyPublishers.ofString("--boundary\r\nContent-Disposition: form-data; name=\"object_id\"\r\n\r\n1\r\n"), HttpRequest.BodyPublishers.ofString("--boundary\r\nContent-Disposition: form-data; name=\"project\"\r\n\r\n1\r\n--boundary--\r\n") ); // 创建请求 HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://localhost:8000/api/v1/tasks/attachments")) .header("Authorization", "Bearer " + authToken) .header("Content-Type", "multipart/form-data; boundary=boundary") .POST(body) .build(); // 发送请求并处理响应 HttpClient client = HttpClient.newHttpClient(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println("响应状态码: " + response.statusCode()); System.out.println("响应体: " + response.body()); } }
说明:
- 这里手动构建了multipart的边界(boundary),你也可以生成随机边界值提升通用性
- 每个表单字段和文件都对应curl里的
-F参数,字段名和值要完全匹配 from_comment在curl里是False,这里直接作为字符串传入——因为multipart表单字段本质都是文本类型
方案二:使用OkHttp库(更简洁易用)
如果你的项目已经引入了OkHttp,这个方案会更简洁,代码可读性更高:
首先需要添加Maven依赖(Gradle用户可对应调整):
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> </dependency>
然后是Java代码:
import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import java.io.File; import java.io.IOException; public class OkHttpMultipartExample { public static void main(String[] args) throws IOException { String authToken = "YOUR_AUTH_TOKEN_HERE"; File imageFile = new File("test.png"); OkHttpClient client = new OkHttpClient(); // 构建multipart请求体 RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("attached_file", "test.png", RequestBody.create(imageFile, MediaType.parse("image/png"))) .addFormDataPart("from_comment", "False") .addFormDataPart("object_id", "1") .addFormDataPart("project", "1") .build(); // 创建请求 Request request = new Request.Builder() .url("http://localhost:8000/api/v1/tasks/attachments") .addHeader("Authorization", "Bearer " + authToken) .post(requestBody) .build(); // 发送请求并处理响应 try (Response response = client.newCall(request).execute()) { System.out.println("响应状态码: " + response.code()); System.out.println("响应体: " + response.body().string()); } } }
说明:
- OkHttp会自动处理multipart的边界和Content-Type头,不需要手动拼接复杂的文本内容
addFormDataPart方法完美对应curl里的-F参数,文件字段需要指定文件名和媒体类型- 这里用了try-with-resources语法自动关闭响应流,避免资源泄漏
注意事项
- 记得把
YOUR_AUTH_TOKEN_HERE替换成实际的授权令牌 - 确保
test.png文件路径正确,或者换成绝对路径避免找不到文件 - 生产环境中建议添加完善的异常处理逻辑,比如捕获IO异常、处理非2xx状态码的响应
内容的提问来源于stack exchange,提问作者Marko
相关产品推荐
相关产品推荐

