7

से वेब एपीआई में Additonal फॉर्म डेटा के साथ फ़ाइल अपलोड करें मैं अतिरिक्त फॉर्म डेटा के साथ एक फ़ाइल अपलोड करने और एमवीसी के माध्यम से वेब एपीआई पर पोस्ट करने की कोशिश कर रहा हूं लेकिन मैं पूरा नहीं कर सका।एमवीसी

MVC साइड

सबसे पहले मैं MVC पर सबमिट किए गए फ़ॉर्म मिला है। इसके लिए यहां कार्रवाई है।

[HttpPost] 
      public async Task<ActionResult> Edit(BrandInfo entity) { 

       try { 
        byte[] logoData = null; 
        if(Request.Files.Count > 0) { 
         HttpPostedFileBase logo = Request.Files[0]; 
         logoData = new byte[logo.ContentLength]; 
         logo.InputStream.Read(logoData, 0, logo.ContentLength); 
         entity.Logo = logo.FileName; 
         entity = await _repo.Update(entity.BrandID, entity, logoData); 
        } 
        else 
         entity = await _repo.Update(entity,entity.BrandID); 
        return RedirectToAction("Index", "Brand"); 
       } 
       catch(HttpApiRequestException e) { 
// logging, etc     
        return RedirectToAction("Index", "Brand"); 
       } 
      } 
कोड पद Multipartform नीचे जाल एपीआई

string requestUri = UriUtil.BuildRequestUri(_baseUri, uriTemplate, uriParameters: uriParameters); 
      MultipartFormDataContent formData = new MultipartFormDataContent(); 
      StreamContent streamContent = null; 
      streamContent = new StreamContent(new MemoryStream(byteData));    
      streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { 
       FileName = "\"" + fileName + "\"", 
       Name = "\"filename\"" 
      }; 
      streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
      formData.Add(streamContent); 
      formData.Add(new ObjectContent<TRequestModel>(requestModel, _writerMediaTypeFormatter), "entity"); 
      return _httpClient.PutAsync(requestUri, formData).GetHttpApiResponseAsync<TResult>(_formatters); 

आप मैं एक ही MultipartFormDataContent साथ फ़ाइल डेटा और वस्तु भेजने की कोशिश कर रहा हूँ देख सकते हैं करने के लिए

। मुझे अपनी इकाई को ObjectContent के रूप में भेजने का बेहतर तरीका नहीं मिला। इसके अलावा मैं JSON.Net Serializer

फिडलर के संबंध में, पोस्ट सफल रहा है।

PUT http://localhost:12836/api/brand/updatewithlogo/13 HTTP/1.1 
Content-Type: multipart/form-data; boundary="10255239-d2a3-449d-8fad-2f31b1d00d2a" 
Host: localhost:12836 
Content-Length: 4341 
Expect: 100-continue 

--10255239-d2a3-449d-8fad-2f31b1d00d2a 
Content-Disposition: form-data; filename="web-host-logo.gif"; name="filename" 
Content-Type: application/octet-stream 

GIF89a��L������X�������wW����������xH�U�)�-�k6�������v6�������̥�v�J���������7����V:�=#�ի�I(�xf�$������� 
// byte data 
// byte data 
'pf�Y��y�ؙ�ڹ�(�; 
--10255239-d2a3-449d-8fad-2f31b1d00d2a 
Content-Type: application/json; charset=utf-8 
Content-Disposition: form-data; name=entity 

{"BrandID":13,"AssetType":null,"AssetTypeID":2,"Logo":"web-host-logo.gif","Name":"Geçici Brand","Models":null,"SupplierBrands":null} 
--10255239-d2a3-449d-8fad-2f31b1d00d2a-- 

वेब एपीआई साइड

अंत में मैं वेब एपीआई पक्ष में पद को पकड़ने कर रहा हूँ और पार्स करने का प्रयास, लेकिन मैं नहीं कर सकता। क्योंकि MultipartFormDataStreamProvider के FileData और FormData संग्रह हमेशा खाली हैं।

[HttpPut] 
     public void UpdateWithLogo(int id) { 
      if(Request.Content.IsMimeMultipartContent()) { 
       var x = 1; // this code has no sense, only here to check IsMimeMultipartContent 
      } 

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

      try { 
       // Read the form data. 
       Request.Content.ReadAsMultipartAsync(provider); 

       foreach(var key in provider.FormData.AllKeys) { 
        foreach(var val in provider.FormData.GetValues(key)) { 
         _logger.Info(string.Format("{0}: {1}", key, val)); 
        } 
       } 

       // This illustrates how to get the file names. 
       foreach(MultipartFileData file in provider.FileData) { 
        _logger.Info(file.Headers.ContentDisposition.FileName); 
        _logger.Info("Server file path: " + file.LocalFileName); 
       }    
      } 
      catch(Exception e) { 
       throw new HttpApiRequestException("Error", HttpStatusCode.InternalServerError, null); 
      }    
     } 

मुझे आशा है कि आप मेरी गलती को ढूंढने में मदद कर सकते हैं।

अद्यतन

मैं भी महसूस किया कि, अगर मैं StreamContent या ObjectContent बाहर टिप्पणी और केवल जोड़ने StringContent, अभी भी मैं कुछ भी नहीं MultipartFormDataStreamProvider से प्राप्त कर सकते हैं।

+0

मैं थोड़ा अलग मुद्दा में भाग गया - ब्राउजर अनुरोध से मेरी फाइलें छोड़ रहा था जब तक कि मैंने उन्हें नाम/आईडी नहीं दिया। इसने समस्या का निदान करने में बहुत मदद की, हालांकि – brichins

उत्तर

5

अंत में मैं अपने समस्या हल हो गई है और आप एपीआई कार्रवाई विधि पर देख सकते हैं मैं ReadAsMultipartAsync विधि synchrously बुलाया था, लेकिन यह एक गलती थी यह सब के बारे में async :)

था। मुझे इसे ContinueWith के साथ कॉल करना पड़ा, इसलिए मैंने अपनी समस्या को हल करने के बाद अपना कोड बदल दिया।

var files = Request.Content.ReadAsMultipartAsync(provider).ContinueWith<HttpResponseMessage>(task => { 
        if(task.IsFaulted) 
         throw task.Exception; 
// do additional stuff 
}); 
+0

यदि यह समस्या ठीक हो गई है, तो इसे स्वीकार के रूप में चिह्नित करें। – anaximander

+0

आह, मैं उस प्रतिबंध को भूल गया। – anaximander

+1

मुझे खेद है, मैं यहां थोड़ा उलझन में हूं। वास्तव में कार्य क्या है? और क्या मुझे यहां भी फॉर्म डेटा भी छीनना चाहिए? – Bobby5193