PHP sayfasına yükleyin ve POST dosyası

6 Cevap java

Ben bir dosya yüklemek ve php sayfanın içine POST için bir yol gerekir ...

Benim php sayfası:

<?php 
$maxsize = 10485760;
$array_estensioni_ammesse=array('.tmp');
$uploaddir = 'uploads/';
if (is_uploaded_file($_FILES['file']['tmp_name']))
{
    if($_FILES['file']['size'] <= $maxsize)
    {
    	$estensione = strtolower(substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], "."), strlen($_FILES['file']['name'])-strrpos($_FILES['file']['name'], ".")));
    	if(!in_array($estensione, $array_estensioni_ammesse))
    	{
    		echo "File is not valid!\n";
    	}
    	else
    	{
    		$uploadfile = $uploaddir . basename($_FILES['file']['name']); 
       		echo "File ". $_FILES['file']['name'] ." uploaded successfully.\n"; 
    		if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile))
    		{
    			echo "File is valid, and was successfully moved.\n";
    		} 
    		else 
    			print_r($_FILES); 
    	}
    }
    else
    	echo "File is not valid!\n";
}
else
{ 
    echo "Upload Failed!!!"; 
    print_r($_FILES);
} 
?>

ve benim masaüstü uygulamasında bu java kodu kullanabilirsiniz:

HttpURLConnection httpUrlConnection = (HttpURLConnection)new URL("http://www.mypage.org/upload.php").openConnection();
        httpUrlConnection.setDoOutput(true);
        httpUrlConnection.setRequestMethod("POST");
        OutputStream os = httpUrlConnection.getOutputStream();
        Thread.sleep(1000);
        BufferedInputStream fis = new BufferedInputStream(new FileInputStream("tmpfile.tmp"));

        for (int i = 0; i < totalByte; i++) {
            os.write(fis.read());
            byteTrasferred = i + 1;
        }

        os.close();
        BufferedReader in = new BufferedReader(
                new InputStreamReader(
                httpUrlConnection.getInputStream()));

        String s = null;
        while ((s = in.readLine()) != null) {
            System.out.println(s);
        }
        in.close();
        fis.close();

Ama ben "Yükleme Başarısız!" Her zaman alırsınız mesajı ...

Bana yardımcı olabilir misiniz?

Thanks a lot

6 Cevap

Konu çok eski olmasına rağmen, yine de (benim gibi :)) birisi etrafında bu sorunu çözmek için daha kolay bir yol arıyor olabilir

After some research I found a way karşı uplaod a file without changing the original poster's Java-Code. You just have karşı 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 inkarşı a file. There is, however one problem: You dont get the original filename, so you have karşı transmit it somehow else.

Ben gerekli Java kodunda biraz değişiklik yapar, bir GET-Parametre kullanarak bu sorunu çözmüş:

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

değişiklikler

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

PHP-komut size hattını değiştirmek

$filename="abc.xyz";

karşı

$filename=$_GET['filename'];

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

Kimseyi yardımcı olabilir umuyoruz :)

Bu eski bir konu olduğunu, ancak başkalarının yararına, burada op sorar tam olarak ne bir fully working örnek:

PHP sunucu kodu:

<?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 istemci kodu:

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) {
            }
        }
    }
}

Siteniz için uyarlamak için nasıl anlamaya olabilir, ama ben yukarıdaki kodu denedim ve çalışıyor. Ama bunun için kredi almak >> See Original Post edemez

PHP Eğer çalıştığınız şekilde okumak mümkün olabilmesi için bir form-çok parçalı kodlanmış sonrası kullanmanız gerekir. This sitesi bunu yapmak için iyi bir yol özetliyor ve size yardımcı olabilir kütüphanelerine bağlantıları vardır.

Yukarıdaki tüm cevaplar% 100 doğru. : Ayrıca yöntem bu gibi bakmak hangi durumda düz prizleri, kullanabilirsiniz

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

Sen doğru HTML dosya yükleme sözcüklerle değil. Sadece url veri bir demet gönderiyorsunuz.

Burada 2 seçenek var:

  • Sen olduğu gibi java kodunu tutmak ve sadece bir dosya olarak ham POST okumak için php kodunu değiştirebilirsiniz.
  • Muhtemelen bir common library kullanarak gerçek bir dosya yükleme yapmak için java kodu değiştirin.

Ben standartlara uyumlu bir şekilde bunu yapmak için java kodu değişiyor tavsiye ederim.

Bu biraz eski farkında ama ben sadece bir answer to a similar question burada da geçerli olması gerektiğini yayınlanmıştır. Bu Daniil ile benzer bir kod içerir, ancak bunun yerine bir Soket HttpURLConnection kullanır.