如何让Java(PDI Kettle)向Azure AutoML端点正确发送图片?
问题描述
已将目标检测模型部署到Azure端点,Python代码运行正常,代码如下:
headers = {'Content-Type': 'application/json', 'Authorization': ('Bearer ' + api_key)} sample_image = os.path.join(directory, filename) # Load image data body = open(sample_image, "rb").read() req = urllib.request.Request(url, body, headers) response = urllib.request.urlopen(req)
尝试在PDI Kettle的UDJC中实现相同功能,Java代码如下:
String urlString = get(Fields.In, "ENDPOINT_URL").getString(r); HttpPost post = new HttpPost(urlString); post.addHeader("Content-Type",get(Fields.In, "CONTENTTYPE").getString(r)); post.addHeader("Authorization",get(Fields.In, "API_KEY").getString(r)); MultipartEntityBuilder entity = MultipartEntityBuilder.create(); entity.setMode(HttpMultipartMode.STRICT); entity.addBinaryBody("file", get(Fields.In, "IMAGEDATA").getBinary(r)); post.setEntity(entity.build()); HttpClient httpClient = HttpClients.createDefault(); HttpResponse response = httpClient.execute(post);
运行后出现错误:http_status result -1 java.net.SocketException: Broken pipe (Write failed)
推测问题出在图片传输方式上,如何让Java实现与Python相同的图片发送方式?
解决方案
你的Python代码是直接将图片二进制数据作为POST请求的原始请求体发送,而非使用Multipart/form-data格式上传文件。要让Java代码和Python行为一致,需修改请求体构造逻辑,调整后的代码如下:
String urlString = get(Fields.In, "ENDPOINT_URL").getString(r); HttpPost post = new HttpPost(urlString); // 对齐Python的请求头设置 post.addHeader("Content-Type", get(Fields.In, "CONTENTTYPE").getString(r)); post.addHeader("Authorization", get(Fields.In, "API_KEY").getString(r)); // 将图片二进制直接作为请求体,替代MultipartEntity byte[] imageData = get(Fields.In, "IMAGEDATA").getBinary(r); InputStreamEntity requestEntity = new InputStreamEntity(new ByteArrayInputStream(imageData), imageData.length); post.setEntity(requestEntity); HttpClient httpClient = HttpClients.createDefault(); HttpResponse response = httpClient.execute(post);
关键说明:
- 删除了
MultipartEntityBuilder相关代码,改用InputStreamEntity直接传递图片二进制,和Python中读取文件二进制作为请求体的逻辑完全匹配 - 需确保
CONTENTTYPE参数与Python中的Content-Type一致(注:Python代码中设置的application/json可能不符合直接传图片二进制的场景,建议根据实际图片格式改为image/jpeg、image/png等) - Azure端点若仅接受原始二进制请求体,而非Multipart格式,此调整可解决"Broken pipe"错误
内容的提问来源于stack exchange,提问作者CDP
相关产品推荐
相关产品推荐

