2010-11-28 68 views
1

我想從我的android設備上傳文件到php服務器。有相同問題的線程,但他正在使用不同的方法。我的Android端代碼工作正常,並顯示沒有錯誤消息,但服務器沒有收到任何文件。這裏是我的示例代碼,我在網上找到它。從Android上傳圖片到PHP服務器

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

    } 
    } 

和我的PHP服務器端的代碼如下

<?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正在運行。當我運行服務器時,出現此錯誤信息上傳文件時出現錯誤,請重試!我檢查了日食中的日誌數據,我認爲是套接字問題,但我不確定。如果有人知道解決方案,請幫助。

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

更改標籤 - 這並不似乎是什麼關係PHP - 你應該能夠用一個簡單的測試頁面來檢查這個使用傳統瀏覽器 – symcbean 2010-12-03 11:08:55

+0

但我認爲這是一個PHP的問題,因爲服務器代碼是在PHP中。 – SilentCoder 2010-12-03 11:50:07

回答

2

看來服務器沒有響應客戶端。嘗試使用通過Android應用程序的ftp連接進行上傳,如果這樣可行,請檢查Apache配置是否接受連接和可寫目錄。當我遇到類似問題時,我的目錄沒有寫入權限。

是來自Java還是來自Apache的錯誤?

1

更改您通過以下方式代碼正確的轉義序列:

更換

String lineEnd = "rn"; 

String lineEnd = "\r\n";