2014-04-29 51 views
0

我寫了這個AsyncTask類,它發送POST數據的數組到我的PHP服務器沒有問題。現在我想擴展它,以便它也發送一個文件到相同的腳本(我已經在PHP文件中的接收處理)。我的意思是我希望它一次性發布DATA + FILE。像多部分實體或從HTML動作到PHP腳本的東西。Android發佈一個多段HTML表單到php服務器

我需要添加什麼,以便它可以上傳文件與其他東西?

public class UpdateSnakeGameStatusTask extends AsyncTask<String, Integer, HttpResponse> { 
    private Context mContext; 
    private ArrayList<NameValuePair> mPairs; 

    /** 
    * @param context The context that uses this AsyncTask thread 
    * @param postPairs <b>NameValuePair</b> which contains name and post data 
    */ 
    public UpdateSnakeGameStatusTask(Context context, ArrayList<NameValuePair> postPairs) { 
     mContext = context; 
     mPairs = new ArrayList<NameValuePair>(postPairs); 
    } 

    @Override 
    protected HttpResponse doInBackground(String... params) { 
     HttpResponse response = null; 
     HttpPost httppost = new HttpPost(params[0]); //this is the URL 

     try { 
      httppost.setEntity(new UrlEncodedFormEntity(mPairs)); 
      HttpClient client = new DefaultHttpClient(); 
      response = client.execute(httppost); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return response; 
    } 
} 
+0

可能重複[如何從Android的手機使用HTTP發送文件到服務器?(http://stackoverflow.com/questions/4126625/how-to-send -a-file-in-android-from-mobile-to-server-using-http) – nKn

+0

@nKn多數民衆贊成只爲一個單一的文件,我想發佈數據+文件在同一職位行動 –

+0

你可以把文件base64編碼在名稱值對。 – greenapps

回答

0

確定爲@greenapps建議(歸功於他)我解決了這個樣子。

沒有被完全解決,因爲我必須解碼服務器端的文件內容並將其手動保存在服務器上。

所以我僅僅指剛添加的文件內容到BasicNameValuePair我已經有了:

String fileAsBase64 = Base64.encodeToString(convertToByteArray(mFile) 
       , Base64.DEFAULT); 

    mPostPairs.add(new BasicNameValuePair("filecontent", fileAsBase64)); 

這是將其轉換爲字節數組的方法:

/** 
* Reads a file and returns its content as byte array 
* @param file file that should be returned as byte array 
* @return byte[] array of bytes of the file 
*/ 
public static byte[] convertTextFileToByteArray(File file) { 
    FileInputStream fileInputStream = null; 
    byte[] bFile = new byte[(int) file.length()]; 
    try { 
     fileInputStream = new FileInputStream(file); 
     fileInputStream.read(bFile); 
     fileInputStream.close(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } finally { 
     try { 
      fileInputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }finally { 
      fileInputStream = null; 
     } 
    } 
    return bFile; 
} 

在服務器端我這樣做:

$content = imap_base64 ($_POST["filecontent"]); 

負責解碼內容恢復正常。

希望這有助於別人太

+0

「在服務器上手動保存」? – greenapps

+0

@greenapps是的,它作爲$ _POST字段到達服務器,而不是$ _FILE,因此我必須從base64手動解碼並將其保存到文件夾中。如果這不是這樣,你建議什麼? –

+0

編寫一些php代碼被分類爲「手動執行」,這讓我感到驚訝。 – greenapps