2014-01-14 25 views
0

這個問題似乎很愚蠢,但我不想犯一個錯誤。如標題所述,我想用post方法將多個字段發送給WS。簡單來說,一個標題(一個字符串)和一個圖像。 到目前爲止,我已經成功發送了圖像(在很多麻煩之後)。從android發送多個值httpPost到WCF服務

下面是Android代碼:

String urlServer = GlobalSession.IP + "insert_reportByte"; 
      URL url = new URL(urlServer); 
      HttpURLConnection connection = (HttpURLConnection) url 
        .openConnection(); 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 
      connection.setUseCaches(false); 

      connection.setRequestMethod("POST"); 

      connection.setRequestProperty("Connection", "Keep-Alive"); 
      connection.setRequestProperty("Content-Type","multipart/form-data"); 

      DataOutputStream outputStream = new DataOutputStream(
        connection.getOutputStream()); 

      outputStream.write(outputByteArray, 0, outputByteArray.length); 
      Log.d("Report", " Amount of data sent for the picture: " + outputByteArray.length); 

      int serverResponseCode = connection.getResponseCode(); 
      String serverResponseMessage = connection.getResponseMessage(); 
      outputStream.flush(); 
      outputStream.close(); 

是sucessfuly發送圖片(outputByteArray)將下列WS:

public void insert_reportByte(Stream input) 
    { 
     MyEntities entities = new MyEntities(); 

     byte[] image = new byte[30*1024]; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      int read; 
      while ((read = input.Read(image, 0, image.Length)) > 0) 
      { 
       ms.Write(image, 0, read); 
      } 
     } 

     String base64stringimage = System.Convert.ToBase64String(image,0,image.Length); 
     entities.insert_report("name hard coded", base64stringimage); 
    } 

所以,我想從delcaration切換到public void insert_reportByte(String name, Stream input)。如何做?或者我必須發送流中的所有內容,然後逐個恢復傳輸的參數?

感謝提示!

回答

0

您需要像這樣在您的請求中添加NameValue對!

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
nameValuePairs.add(new BasicNameValuePair(name, "myName"));  
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

我希望它能幫上忙!見this答案!

1

看起來像你的問題是處理Multipart data請求。
對於Android客戶端,你可以看看this answer,有一個MultipartEntity這是一個由多個身體部分組成的多部分/形式編碼的HTTP實體。您的請求工具看起來像這樣:

HttpPost httppost = new HttpPost(urlServer); 
    MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
    multipartEntity.addPart("name", new StringBody("your input name here")); 
    multipartEntity.addPart("Image", new FileBody(new File(imagePath))); 
    httppost.setEntity(multipartEntity); 
    mHttpClient.execute(httppost); 

而從服務器端來說,您的方法只需要一個流參數。但是你需要以不同的方式解析這個流。 Here就是一個使用form parser library的例子。因此,您的方法應該如下所示:

public void insert_reportByte(Stream stream) 
{ 
    HttpMultipartParser parser = new HttpMultipartParser(data, "Image"); 

if (parser.Success) 
{ 
    // get the name from android client 
    string name = HttpUtility.UrlDecode(parser.Parameters["name"]); 

    // Save the file somewhere 
    File.WriteAllBytes(your_server_file_path, parser.FileContents); 
} 
} 

希望這可以提供幫助。