2010-11-28 10 views
1

Ich versuche, Datei von meinem Android-Gerät auf einen PHP-Server hochzuladen. Es gibt einen Thread mit derselben Frage, aber er verwendet eine andere Methode. Mein Android-Seitencode funktioniert einwandfrei und zeigt keine Fehlermeldung an, aber der Server erhält keine Datei. Hier ist mein Beispielcode, ich habe es online gefunden.Laden Sie ein Bild von Android auf PHP-Server

import java.io.FileInputStream; 
import android.app.Activity; 
import android.os.Bundle; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import android.util.Log; 

public class uploadfile extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    doFileUpload(); 
} 

private void doFileUpload(){ 
HttpURLConnection conn = null; 
DataOutputStream dos = null; 
DataInputStream inStream = null;  
String exsistingFileName = "/sdcard/def.jpg"; 

// Is this the place are you doing something wrong. 
String lineEnd = "rn"; 
String twoHyphens = "--"; 
String boundary = "*****"; 

int bytesRead, bytesAvailable, bufferSize; 
byte[] buffer; 
int maxBufferSize = 1*1024*1024; 
String responseFromServer = ""; 
String urlString = "http://192.168.1.6/index.php"; 

try 
    { 
     //------------------ CLIENT REQUEST 
     Log.e("MediaPlayer","Inside second Method"); 
     FileInputStream fileInputStream = new FileInputStream(new File(exsistingFileName)); 

             // open a URL connection to the Servlet 
             URL url = new URL(urlString); 

             // Open a HTTP connection to the URL 
             conn = (HttpURLConnection) url.openConnection(); 

             // Allow Inputs 
             conn.setDoInput(true); 

             // Allow Outputs 
             conn.setDoOutput(true); 

             // Don't use a cached copy. 
             conn.setUseCaches(false); 

             // Use a post method. 
             conn.setRequestMethod("POST"); 
             conn.setRequestProperty("Connection", "Keep-Alive"); 
             conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); 

             dos = new DataOutputStream(conn.getOutputStream()); 
             dos.writeBytes(twoHyphens + boundary + lineEnd); 
             dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" 
                  + exsistingFileName + "\"" + lineEnd); 
             dos.writeBytes(lineEnd); 
             Log.e("MediaPlayer","Headers are written"); 

             // create a buffer of maximum size 
             bytesAvailable = fileInputStream.available(); 
             bufferSize = Math.min(bytesAvailable, maxBufferSize); 
             buffer = new byte[bufferSize]; 

             // read file and write it into form... 
             bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

             while (bytesRead > 0){ 
                   dos.write(buffer, 0, bufferSize); 
                   bytesAvailable = fileInputStream.available(); 
                   bufferSize = Math.min(bytesAvailable, maxBufferSize); 
                   bytesRead = fileInputStream.read(buffer, 0, bufferSize);             
             } 

             // send multipart form data necesssary after file data... 
             dos.writeBytes(lineEnd); 
             dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

             // close streams 
             Log.e("MediaPlayer","File is written"); 
             fileInputStream.close(); 
             dos.flush(); 
             dos.close(); 

        } 

     catch (MalformedURLException ex) 

    { 

      Log.e("MediaPlayer", "error: " + ex.getMessage(), ex); 

     } 



     catch (IOException ioe) 

     { 

      Log.e("MediaPlayer", "error: " + ioe.getMessage(), ioe); 

     } 

     //------------------ read the SERVER RESPONSE 
     try { 
      inStream = new DataInputStream (conn.getInputStream()); 
      String str; 

      while ((str = inStream.readLine()) != null) 
      { 
       Log.e("MediaPlayer","Server Response"+str); 
      } 

      inStream.close(); 
     } 

     catch (IOException ioex){ 
      Log.e("MediaPlayer", "error: " + ioex.getMessage(), ioex); 
     } 

    } 
    } 

und meine PHP-Server-Side-Code ist als

<?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!"; 
    } 
    ?> 

Apache folgt ausgeführt wird. Wenn ich den Server starte, wird diese Fehlermeldung angezeigt. Beim Hochladen der Datei ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut. Ich habe die Log-Daten in Eclipse überprüft und was ich denke, ist das Socket-Problem, aber ich bin mir nicht sicher. Bitte helfen Sie, wenn jemand die Lösung kennt.

11-28 05:37:55.310: DEBUG/SntpClient(59): request time failed: java.net.SocketException: Address family not supported by protocol 
+0

Geänderte tags - dies scheint nicht alles zu sein, mit dem zu tun PHP - Sie sollten dies mit einer einfachen Testseite mit einem herkömmlichen Browser überprüfen können – symcbean

+0

Aber ich denke, das ist eine PHP-Frage, da der Server-Code in PHP ist. – SilentCoder

+0

Ich habe diesen Code ausprobiert und von dem, was ich sagen kann, wird keine Datei in der POST-Anfrage gesendet. Ich testete mit var_dump ($ _ FILES); – Richard

Antwort

2

Es scheint, dass der Server nicht auf den Client reagiert. Versuche das Hochladen mit einer FTP-Verbindung über die Android-Anwendung. Wenn dies funktioniert, überprüfe deine Apache-Konfiguration auf die Annahme von Verbindungen und schreibbaren Verzeichnissen. Als ich ein ähnliches Problem hatte, stellte sich heraus, dass mein Verzeichnis keine Schreibrechte hatte.

Ist der Fehler von Java oder Apache?

+0

im tyring zu verbinden aber ftp clien Verbindung mit dem Server fehlgeschlagen Ich habe Verwirrung, wie man Server laufen lässt. Muss ich Apache laufen lassen und Server URL im browser öffnen? oder muss ich etwas anderes tun? der Fehler msg ist im eclipse Protokoll. – SilentCoder

+0

irgendein Vorschlag plz ?? – SilentCoder

+0

Wenn Sie versuchen, die Daten zu übertragen, dann hat Apache nichts damit zu tun, Sie müssen einen FTP-Server laufen lassen.In diesem Fall brauchen Sie die PHP-Datei nicht, um zu "fangen", was hochgeladen wird Andererseits, wenn Sie versuchen, mit PHP hochzuladen, sollten Sie einen "_POST" verwenden, um von Ihrem Ja zu übergeben va zu deinem PHP der Dateiname. Der Code, den Sie uns gegeben haben, ist auf dem richtigen Weg, scheint aber den zu ladenden Dateinamen nicht zu kennen. Hoffe das hilft. –

1

ändern Sie den Code in folgenden Weise für die richtigen Escape-Sequenzen:

ersetzen

String lineEnd = "rn"; 

mit

String lineEnd = "\r\n";