如何用Java调用CURL POST请求上传图片至Google Cloud Storage
问题分析与解决方案
错误原因
你的Java代码调用cURL时,ProcessBuilder的参数处理存在多处错误,导致命令解析失败:
- 参数拆分错误:
ProcessBuilder要求每个命令选项和对应的值必须是独立字符串,不能将选项与值合并(比如"-X POST"要拆成"-X"和"POST")。 --data-binary格式错误:原cURL命令需要用@指定文件路径,你漏写了@符号,且将选项和路径合并成了一个参数。- Header参数处理错误:不需要手动添加双引号转义,
ProcessBuilder会自动处理参数中的空格,直接将Header内容作为独立参数传递即可。
修正后的代码
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class GcsUpload { public static void main(String[] args) { String tokenAuth = "TOKEN_HERE"; String filePath = "C:/DL API/vecteezy_isolated-tree-high-res_17219851_371.png"; String bucketName = "YOUR_BUCKET_NAME"; // 替换为你的存储桶名称 String objectName = "test.png"; ProcessBuilder pb = new ProcessBuilder( "curl", "-X", "POST", "--data-binary", "@" + filePath, "-H", "Authorization: Bearer " + tokenAuth, "-H", "Content-Type: image/png", "https://storage.googleapis.com/upload/storage/v1/b/" + bucketName + "/o?uploadType=media&name=" + objectName ); pb.redirectErrorStream(true); try { Process p = pb.start(); // 正确读取cURL输出 BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } int exitCode = p.waitFor(); System.out.println("cURL执行退出码: " + exitCode); } catch (IOException | InterruptedException e) { System.err.println("错误: " + e.getMessage()); } } }
关键修正点说明
- 将每个cURL选项与对应的值拆分为独立字符串参数,比如
"-X"和"POST"、"-H"和"Authorization: Bearer " + tokenAuth。 - 修复
--data-binary参数,添加@符号指定文件路径:"--data-binary", "@" + filePath。 - 替换代码中的
YOUR_BUCKET_NAME为实际的存储桶名称。 - 改进输出读取逻辑,用
BufferedReader正确获取cURL的执行结果和错误信息。
内容的提问来源于stack exchange,提问作者JrmyQg
相关产品推荐
相关产品推荐

