使用java HTTP POST连接发送图像文件

我正在尝试使用Java HTTP POST请求将图像发送到网站。

我正在使用此处使用的基本代码将文件从Java客户端上传到HTTP服务器 :

这是我的修改:

String urlToConnect = "http://localhost:9000/upload"; File fileToUpload = new File("C:\\Users\\joao\\Pictures\\bla.jpg"); String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value. URLConnection connection = new URL(urlToConnect).openConnection(); connection.setDoOutput(true); // This sets request method to POST. connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); PrintWriter writer = null; try { writer = new PrintWriter(new OutputStreamWriter(connection.getOutputStream())); writer.println("--" + boundary); writer.println("Content-Disposition: form-data; name=\"picture\"; filename=\"bla.jpg\""); writer.println("Content-Type: image/jpeg"); writer.println(); BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileToUpload))); for (String line; (line = reader.readLine()) != null;) { writer.println(line); } } finally { if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} } writer.println("--" + boundary + "--"); } finally { if (writer != null) writer.close(); } // Connection is lazily executed whenever you request any status. int responseCode = ((HttpURLConnection) connection).getResponseCode(); System.out.println(responseCode); // Should be 200 

我最终获得了200个响应代码,但是图像是错误的,就像随机颜色一样,这让我觉得它在字符编码中是一个错误。 我尝试使用原始示例中的UTF-8,但这只会创建一个损坏的图像。

我也100%确定它不是服务器端问题,因为我可以使用其他客户端,例如Advanced Rest Client / Postman,他们可以发送没有问题的图像。

你能帮我指出什么是错的吗? 谢谢。

 import java.io.File; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.ContentBody; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreProtocolPNames; import org.apache.http.util.EntityUtils; public class PostFile { public static void main(String[] args) throws Exception { HttpClient httpclient = new DefaultHttpClient(); httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); HttpPost httppost = new HttpPost("http://localhost:9000/upload"); File file = new File("C:\\Users\\joao\\Pictures\\bla.jpg""); MultipartEntity mpEntity = new MultipartEntity(); ContentBody cbFile = new FileBody(file, "image/jpeg"); mpEntity.addPart("userfile", cbFile); httppost.setEntity(mpEntity); System.out.println("executing request " + httppost.getRequestLine()); HttpResponse response = httpclient.execute(httppost); HttpEntity resEntity = response.getEntity(); System.out.println(response.getStatusLine()); if (resEntity != null) { System.out.println(EntityUtils.toString(resEntity)); } if (resEntity != null) { resEntity.consumeContent(); } httpclient.getConnectionManager().shutdown(); } } 

使用HttpClient来计算出这段代码。 除了以自定义方式处理某些内容之外,使用除了从头开始处理之外的稳定库总是更好。

Reader / Writer类用于处理文本数据,而图像是二进制的。 您需要将文件解释为二进制文件:

 FileChannel in = new FileInputStream(fileToUpload).getChannel(); WritableByteChannel out = Channels.newChannel(connection.getOutputStream()); in.transferTo(0, fileToUpload.size(), out) 

当然,您仍需要关闭所有已打开的资源。

试试看:

 private DefaultHttpClient mHttpClient; Context context; public String error = ""; //Contrutor para que metodos possam ser usados fora de uma activity public HTTPconector(Context context) { this.context = context; } public HTTPconector() { HttpParams params = new BasicHttpParams(); params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); mHttpClient = new DefaultHttpClient(params); } public void FileClientPost(String txtUrl, File file){ try { error = ""; HttpPost httppost = new HttpPost(txtUrl); MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); multipartEntity.addPart("Image", new FileBody(file)); httppost.setEntity(multipartEntity); mHttpClient.execute(httppost, new PhotoUploadResponseHandler()); } catch (Exception e) { Log.e(HTTPconector.class.getName(), e.getLocalizedMessage(), e); e.getStackTrace(); error = e.getMessage(); } } //Verifica se a rede esta disponível public boolean isNetworkAvailable() { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); // if no network is available networkInfo will be null // otherwise check if we are connected if (networkInfo != null && networkInfo.isConnected()) { return true; } return false; } public String Get(String txtUrl){ try { URL url = new URL(txtUrl); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setReadTimeout(10000); con.setConnectTimeout(15000); con.setRequestMethod("GET"); con.setDoInput(true); con.connect(); return readStream(con.getInputStream()); } catch (ProtocolException e) { e.printStackTrace(); return "ERRO: "+e.getMessage(); } catch (IOException e) { e.printStackTrace(); return "ERRO: "+e.getMessage(); } } public String Post(String txtUrl){ File image; try { URL url = new URL(txtUrl); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("POST"); con.setDoInput(true); con.setDoOutput(true); con.connect(); //con.getOutputStream().write( ("name=" + "aa").getBytes()); return readStream(con.getInputStream()); } catch (ProtocolException e) { e.printStackTrace(); return "ERRO: "+e.getMessage(); } catch (IOException e) { e.printStackTrace(); return "ERRO: "+e.getMessage(); } } //Usado para fazer conexão com a internet public String conectar(String u){ String resultServer = ""; try { URL url = new URL(u); HttpURLConnection con = (HttpURLConnection) url.openConnection(); resultServer = readStream(con.getInputStream()); } catch (Exception e) { e.printStackTrace(); resultServer = "ERRO: "+ e.getMessage(); } Log.i("HTTPMANAGER: ", resultServer); return resultServer; } //Lê o resultado da conexão private String readStream(InputStream in) { String serverResult = ""; BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(in)); String line = ""; while ((line = reader.readLine()) != null) { System.out.println(line); } serverResult = reader.toString(); } catch (IOException e) { e.printStackTrace(); serverResult = "ERRO: "+ e.getMessage(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); serverResult = "ERRO: "+ e.getMessage(); } } } return serverResult; } private class PhotoUploadResponseHandler implements ResponseHandler { @Override public Object handleResponse(HttpResponse response)throws ClientProtocolException, IOException { HttpEntity r_entity = response.getEntity(); String responseString = EntityUtils.toString(r_entity); Log.d("UPLOAD", responseString); return null; } }