Upload and POST file to PHP page with Java

前端 未结 6 1411
臣服心动
臣服心动 2020-12-01 10:14

I need a way to upload a file and POST it into php page...

My php page is:



        
相关标签:
6条回答
  • 2020-12-01 10:28

    This is an old thread, but for the benefit of others, here is a fully working example of exactly what the op asks for:

    PHP server code:

    <?php 
    
    $target_path = "uploads/"; 
    
    $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 
    
    if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
        echo "The file ". basename( $_FILES['uploadedfile']['name'])." has been uploaded"; 
    } else{ 
        echo "There was an error uploading the file, please try again!"; 
    }
    
    ?> 
    

    Java client code:

    import java.io.OutputStream;
    import java.io.InputStream;
    import java.net.URLConnection;
    import java.net.URL;
    import java.net.Socket;
    
    public class Main {
        private final String CrLf = "\r\n";
    
        public static void main(String[] args) {
            Main main = new Main();
            main.httpConn();
        }
    
        private void httpConn() {
            URLConnection conn = null;
            OutputStream os = null;
            InputStream is = null;
    
            try {
                URL url = new URL("http://localhost/test/post.php");
                System.out.println("url:" + url);
                conn = url.openConnection();
                conn.setDoOutput(true);
    
                String postData = "";
    
                InputStream imgIs = getClass().getResourceAsStream("/test.jpg");
                byte[] imgData = new byte[imgIs.available()];
                imgIs.read(imgData);
    
                String message1 = "";
                message1 += "-----------------------------4664151417711" + CrLf;
                message1 += "Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"test.jpg\""
                        + CrLf;
                message1 += "Content-Type: image/jpeg" + CrLf;
                message1 += CrLf;
    
                // the image is sent between the messages in the multipart message.
    
                String message2 = "";
                message2 += CrLf + "-----------------------------4664151417711--"
                        + CrLf;
    
                conn.setRequestProperty("Content-Type",
                        "multipart/form-data; boundary=---------------------------4664151417711");
                // might not need to specify the content-length when sending chunked
                // data.
                conn.setRequestProperty("Content-Length", String.valueOf((message1
                        .length() + message2.length() + imgData.length)));
    
                System.out.println("open os");
                os = conn.getOutputStream();
    
                System.out.println(message1);
                os.write(message1.getBytes());
    
                // SEND THE IMAGE
                int index = 0;
                int size = 1024;
                do {
                    System.out.println("write:" + index);
                    if ((index + size) > imgData.length) {
                        size = imgData.length - index;
                    }
                    os.write(imgData, index, size);
                    index += size;
                } while (index < imgData.length);
                System.out.println("written:" + index);
    
                System.out.println(message2);
                os.write(message2.getBytes());
                os.flush();
    
                System.out.println("open is");
                is = conn.getInputStream();
    
                char buff = 512;
                int len;
                byte[] data = new byte[buff];
                do {
                    System.out.println("READ");
                    len = is.read(data);
    
                    if (len > 0) {
                        System.out.println(new String(data, 0, len));
                    }
                } while (len > 0);
    
                System.out.println("DONE");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                System.out.println("Close connection");
                try {
                    os.close();
                } catch (Exception e) {
                }
                try {
                    is.close();
                } catch (Exception e) {
                }
                try {
    
                } catch (Exception e) {
                }
            }
        }
    }
    

    you can figure out how to adapt it for your site, but I have tested the above code and it works. I can't take credit for it though >> See Original Post

    0 讨论(0)
  • 2020-12-01 10:31

    I realize this is a bit old but I just posted an answer to a similar question that should be applicable here as well. It includes code similar to Daniil's, but uses HttpURLConnection instead of a Socket.

    0 讨论(0)
  • 2020-12-01 10:34

    All above answers are 100% correct. You can also use plain sockets, in which case your method would look like this:

            // Compose the request header
            StringBuffer buf = new StringBuffer();
            buf.append("POST ");
            buf.append(uploader.getUploadAction());
            buf.append(" HTTP/1.1\r\n");
            buf.append("Content-Type: multipart/form-data; boundary=");
            buf.append(boundary);
            buf.append("\r\n");
            buf.append("Host: ");
            buf.append(uploader.getUploadHost());
            buf.append(':');
            buf.append(uploader.getUploadPort());
            buf.append("\r\n");
            buf.append("Connection: close\r\n");
            buf.append("Cache-Control: no-cache\r\n");
    
            // Add cookies
            List cookies = uploader.getCookies();
            if (!cookies.isEmpty())
                {
                    buf.append("Cookie: ");
                    for (Iterator iterator = cookies.iterator(); iterator.hasNext(); )
                        {
                            Parameter parameter = (Parameter)iterator.next();
    
                            buf.append(parameter.getName());
                            buf.append('=');
                            buf.append(parameter.getValue());
    
                            if (iterator.hasNext())
                                buf.append("; ");
                        }
    
                    buf.append("\r\n");
                }
    
            buf.append("Content-Length: ");
    
            // Request body
            StringBuffer body = new StringBuffer();
            List fields = uploader.getFields();
            for (Iterator iterator = fields.iterator(); iterator.hasNext();)
                {
    
                    Parameter parameter = (Parameter) iterator.next();
    
                    body.append("--");
                    body.append(boundary);
                    body.append("\r\n");
                    body.append("Content-Disposition: form-data; name=\"");
                    body.append(parameter.getName());
                    body.append("\"\r\n\r\n");
                    body.append(parameter.getValue());
                    body.append("\r\n");
                }
    
            body.append("--");
            body.append(boundary);
            body.append("\r\n");
            body.append("Content-Disposition: form-data; name=\"");
            body.append(uploader.getImageFieldName());
            body.append("\"; filename=\"");
            body.append(file.getName());
            body.append("\"\r\n");
            body.append("Content-Type: image/pjpeg\r\n\r\n");
    
            String boundary = "WHATEVERYOURDEARHEARTDESIRES";
            String lastBoundary = "\r\n--" + boundary + "--\r\n";
            long length = file.length() + (long) lastBoundary.length() + (long) body.length();
            long total = buf.length() + body.length();
    
            buf.append(length);
            buf.append("\r\n\r\n");
    
            // Upload here
            InetAddress address = InetAddress.getByName(uploader.getUploadHost());
            Socket socket = new Socket(address, uploader.getUploadPort());
            try
                {
                    socket.setSoTimeout(60 * 1000);
                    uploadStarted(length);
    
                    PrintStream out = new PrintStream(new BufferedOutputStream(socket.getOutputStream()));
                    out.print(buf);
                    out.print(body);
    
                    // Send the file
                    byte[] bytes = new byte[1024 * 65];
                    int size;
                    InputStream in = new BufferedInputStream(new FileInputStream(file));
                    try
                        {
                            while ((size = in.read(bytes)) > 0)
                                {
                                    total += size;
                                    out.write(bytes, 0, size);
                                    transferred(total);
                                }
                        }
                    finally
                        {
                            in.close();
                        }
    
                    out.print(lastBoundary);
                    out.flush();
    
                    // Read the response
                    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    while (reader.readLine() != null);
                }
            finally
                {
                    socket.close();
                }
    
    0 讨论(0)
  • 2020-12-01 10:42

    You are not using the correct HTML file upload semantics. You are just posting a bunch of data to the url.

    You have 2 option here:

    • You can keep the java code as-is, and change the php code to just read the raw POST as a file.
    • Change the java code to do a real file upload possibly using a common library.

    I'd recommend changing the java code to do this in a standards compliant way.

    0 讨论(0)
  • 2020-12-01 10:44

    Even though the thread is very old, there may still be someone around looking for a more easy way to solve this problem (like me :))

    After some research I found a way to uplaod a file without changing the original poster's Java-Code. You just have to use the following PHP-code:

    <?php
      $filename="abc.xyz";
      $fileData=file_get_contents('php://input');
      $fhandle=fopen($filename, 'wb');
      fwrite($fhandle, $fileData);
      fclose($fhandle);
      echo("Done uploading");
    ?>
    

    This code is just fetching the raw data sent by the java-application and writing it into a file. There is, however one problem: You dont get the original filename, so you have to transmit it somehow else.

    I solved this problem by using a GET-Parameter, which makes a little change in the Java-code necessary:

    HttpURLConnection httpUrlConnection = (HttpURLConnection)new URL("http://www.mypage.org/upload.php").openConnection();
    

    changes to

    HttpURLConnection httpUrlConnection = (HttpURLConnection)new URL("http://www.mypage.org/upload.php?filename=abc.def").openConnection();
    

    In your PHP-script you change the line

    $filename="abc.xyz";
    

    to

    $filename=$_GET['filename'];
    

    This solution doesn't use any external librarys and seems to me much more simple than some of the other posted ones...

    Hope I could help anyone:)

    0 讨论(0)
  • 2020-12-01 10:50

    You need to use a form-multipart encoded post for PHP to be able to read it the way you are attempting. This website outlines a good way to do it and has links to libraries that can help you out.

    0 讨论(0)
提交回复
热议问题