2015-12-09 2 views
0

привет, я работаю с веб-API asp.net. Я хочу получить многокомпонентные данные из приложения http-метода приложения Android. я могу получить файл из запроса, но я не могу получить строковые данные, связанные с многочастным запросом.can not fetch multi-part string в asp.net web api

вот мой код

var fcount = HttpContext.Current.Request.Files.Count; 
      for (i = 0; i <= fcount - 1; i++) 
      { 

       var files = HttpContext.Current.Request.Files[i]; 
       string FileName = Com.GetUnique(files.FileName); 
       files.SaveAs(sPath + FileName); 
      } 

      // string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
      var provider = new MultipartFormDataStreamProvider(sPath); 


      try 
      { 
       await Request.Content.ReadAsMultipartAsync(provider); 

       // Show all the key-value pairs. 
       //foreach (var key in provider.FormData.AllKeys) 
       //{ 
        foreach (var val in provider.FormData.GetValues("data")) 
        { 
         string data = val; 
         // dynamic dat = js.Deserialize(data); 
         dynamic usr = js.DeserializeObject(data); 

         save.Db_data = fcount + "," + val; 
         db.Tempsave.Add(save); 
         db.SaveChanges(); 
        } 
       // } 

       return Request.CreateResponse(HttpStatusCode.OK); 
      } 

сервер здесь андроид код

FileInputStream fileInputStream = new FileInputStream(sourceFile); 
        URL url = new URL(url1); 

        // Open a HTTP connection to the URL 
        conn = (HttpURLConnection) url.openConnection(); 
        conn.setDoInput(true); // Allow Inputs 
        conn.setDoOutput(true); // Allow Outputs 
        conn.setUseCaches(false); // Don't use a Cached Copy 
        conn.setRequestMethod("POST"); 
        conn.setRequestProperty("Connection", "Keep-Alive"); 
        conn.setRequestProperty("ENCTYPE", "multipart/form-data"); 
        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 

        dos = new DataOutputStream(conn.getOutputStream()); 


        dos.writeBytes(twoHyphens + boundary + lineEnd); 


        // JSON STRING 
        dos.writeBytes("Content-Disposition: form-data; name=\"data\""); 

        dos.writeBytes(lineEnd); 

        dos.writeBytes(json); 
        dos.writeBytes(lineEnd); 
        dos.writeBytes(twoHyphens + boundary + lineEnd); 

        // IMAGE 
        dos.writeBytes(twoHyphens + boundary + lineEnd); 
        dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename="+ sourceFileUri + "" + lineEnd); 
        dos.writeBytes(lineEnd); 


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

        // Responses from the server (code and message) 
        serverResponseCode = conn.getResponseCode(); 
        String serverResponseMessage = conn.getResponseMessage(); 

как я могу извлечь строку, связанную с запросом из нескольких частей.? пожалуйста, помогите заблаговременно :)

ответ

0

Теперь, пока ваши данные формы были написаны правильно, это должно сработать. Я должен был сделать то же самое точное выполнение процесса в другой ситуации, но все еще используя WebAPI. Дайте мне знать, если это сработает, и если это не так, я постараюсь помочь и дальше.

foreach (var val in provider.Contents) 
{ 
    switch (val.Headers.ContentDisposition.Name) 
    { 
     case "data": 
      string name = val.ReadAsStringAsync().Result; 
      break; 
    } 
} 

EDIT: также .. что переключатель оператор может легко быть:

if (val.Headers.ContentDisposition.Name == "data") string name = val.ReadAsStringAsync().Result; 
+0

это не входя, если петля –

+0

@Manuprasad просто чтобы убедиться, что вы не имея каких-либо проблем, извлекая изображения вы публикуете, правильно? – terbubbs

+0

@Manuprasad, когда вы повторяете цикл foreach, каковы значения 'val'? – terbubbs