使用HttpURLConnection到PHP的POST文件

时间:2014-08-20 10:45:22

标签: java http post client-server httpurlconnection

我已经提到了这个链接Sending files using POST with 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文件

<?php 
move_uploaded_file($_FILES['userfile']["tmp_name"], "test.txt");
//file_put_contents("test", "asd".$_FILES['userfile']);
print_r($_FILES);
print_r($_REQUEST);
?>

我得到的结果是

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

)
Array
(
)

提前致谢!

1 个答案:

答案 0 :(得分:0)

最后,我通过添加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
 * <http://www.apache.org/>.
 *
 */

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();
        }
    }

}