使用HttpURLConnection到PHP的POST文件

我已经引用了这个链接使用POST和HttpURLConnection发送文件

使用以下代码,我正在尝试将文件POST到本地PHP服务器。 它总是在我的PHP文件中返回文件大小0

public class FileUpload2 { String CRLF = "\r\n"; /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { new FileUpload2().put("http://localhost/test/test.php"); } public void put(String targetURL) throws Exception { String BOUNDRY = "=================================="; HttpURLConnection conn = null; try { // These strings are sent in the request body. They provide // information about the file being uploaded String contentDisposition = "Content-Disposition: form-data; name=\"userfile\"; filename=\"test.txt\""; String contentType = "Content-Type: application/octet-stream"; // This is the standard format for a multipart request StringBuffer requestBody = new StringBuffer(); requestBody.append("--"); requestBody.append(BOUNDRY); requestBody.append(CRLF); requestBody.append(contentDisposition); requestBody.append(CRLF); requestBody.append(contentType); requestBody.append(CRLF); requestBody.append("Content-Transfer-Encoding: binary" + CRLF); requestBody.append(CRLF); requestBody.append(new String(getFileBytes("test.txt"))); requestBody.append("--"); requestBody.append(BOUNDRY); requestBody.append("--"); requestBody.append(CRLF); // Make a connect to the server URL url = new URL(targetURL); conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDRY); conn.setRequestProperty("Cache-Control", "no-cache"); // Send the body DataOutputStream dataOS = new DataOutputStream( conn.getOutputStream()); dataOS.writeBytes(requestBody.toString()); dataOS.flush(); dataOS.close(); // Ensure we got the HTTP 200 response code int responseCode = conn.getResponseCode(); if (responseCode != 200) { throw new Exception(String.format( "Received the response code %d from the URL %s", responseCode, url)); } // Read the response InputStream is = conn.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] bytes = new byte[1024]; int bytesRead; while ((bytesRead = is.read(bytes)) != -1) { baos.write(bytes, 0, bytesRead); } byte[] bytesReceived = baos.toByteArray(); baos.close(); is.close(); String response = new String(bytesReceived); System.out.println(response); // TODO: Do something here to handle the 'response' string } finally { if (conn != null) { conn.disconnect(); } } } public byte[] getFileBytes(String file) throws IOException { ByteArrayOutputStream ous = null; InputStream ios = null; try { byte[] buffer = new byte[4096]; ous = new ByteArrayOutputStream(); ios = this.getClass().getResourceAsStream(file); int read = 0; while ((read = ios.read(buffer)) != -1) ous.write(buffer, 0, read); } finally { try { if (ous != null) ous.close(); } catch (IOException e) { // swallow, since not that important } try { if (ios != null) ios.close(); } catch (IOException e) { // swallow, since not that important } } return ous.toByteArray(); } 

PHP文件

  

我得到的结果是

 Array ( [userfile] => Array ( [name] => test.txt [type] => [tmp_name] => [error] => 3 [size] => 0 ) ) Array ( ) 

提前致谢!

最后我通过添加apache http客户端库而不是HttpUrlConnection解决了这个问题。

 /* * ==================================================================== * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . * */ import java.io.BufferedReader; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; /** * Example how to use multipart/form encoded POST request. */ public class ClientMultipartFormPost { public static void main(String[] args) throws Exception { /*if (args.length != 1) { System.out.println("File path not given"); System.exit(1); }*/ CloseableHttpClient httpclient = HttpClients.createDefault(); InputStream responseStream = null ; String responseString = "" ; try { HttpPost httppost = new HttpPost("http://localhost/test/test.php"); FileBody bin = new FileBody(new File("D:/Jeyasithar/Workspace/Java/TestJava/src/test.txt")); StringBody comment = new StringBody("A binary file of some kind", ContentType.TEXT_PLAIN); HttpEntity reqEntity = MultipartEntityBuilder.create() .addPart("bin", bin) .addPart("comment", comment) .build(); httppost.setEntity(reqEntity); System.out.println("executing request " + httppost.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httppost); try { System.out.println("----------------------------------------"); System.out.println(response.getStatusLine()); HttpEntity resEntity = response.getEntity(); if (resEntity != null) { System.out.println("Response content length: " + resEntity.getContentLength()); responseStream = resEntity.getContent() ; if (responseStream != null){ BufferedReader br = new BufferedReader (new InputStreamReader (responseStream)) ; String responseLine = br.readLine() ; String tempResponseString = "" ; while (responseLine != null){ tempResponseString = tempResponseString + responseLine + System.getProperty("line.separator") ; responseLine = br.readLine() ; } br.close() ; if (tempResponseString.length() > 0){ responseString = tempResponseString ; System.out.println(responseString); } } } EntityUtils.consume(resEntity); } finally { response.close(); } } finally { httpclient.close(); } } }