2012-04-26 12 views
51

मैं एक WebAPI सेवा एक सरल रूप से एक अपलोड हैंडलिंग, इस तरह की है का उपयोग कर फ़ाइल अपलोड के साथ एक बहुखण्डीय पद प्रदर्शन करने के लिए:ASP.NET WebAPI: कैसे WebAPI HttpClient

<form action="/api/workitems" enctype="multipart/form-data" method="post"> 
     <input type="hidden" name="type" value="ExtractText" /> 
     <input type="file" name="FileForUpload" /> 
     <input type="submit" value="Run test" /> 
    </form> 

हालांकि, मैं नहीं कर सकता HttpClient API का उपयोग करके उसी पोस्ट को अनुकरण करने का तरीका जानें। FormUrlEncodedContent बिट काफी आसान है, लेकिन मैं नाम के साथ फ़ाइल सामग्री को पोस्ट में कैसे जोड़ूं?

+0

क्या आप WebApi पक्ष में कोड साझा करना चाहते हैं जो MultipartFormDataContent का उपभोग करता है? – granadaCoder

उत्तर

107

ज्यादा परीक्षण और त्रुटि के बाद, यहाँ कोड है कि वास्तव में काम करता है:

using (var client = new HttpClient()) 
{ 
    using (var content = new MultipartFormDataContent()) 
    { 
     var values = new[] 
     { 
      new KeyValuePair<string, string>("Foo", "Bar"), 
      new KeyValuePair<string, string>("More", "Less"), 
     }; 

     foreach (var keyValuePair in values) 
     { 
      content.Add(new StringContent(keyValuePair.Value), keyValuePair.Key); 
     } 

     var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName)); 
     fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
     { 
      FileName = "Foo.txt" 
     }; 
     content.Add(fileContent); 

     var requestUri = "/api/action"; 
     var result = client.PostAsync(requestUri, content).Result; 
    } 
} 
+17

बड़ी फ़ाइलों के लिए स्ट्रीमकंटेंट का उपयोग करें: var fileContent = new StreamContent (File.OpenRead (fileName)); –

+0

वूहू - मेरे पास एक बिल्कुल अलग मुद्दा था, लेकिन फिर भी सामग्री पोस्ट करने की आवश्यकता थी। मैं अपनी जरूरतों को पूरा करने के लिए संशोधित करने में सक्षम था। बहुत बहुत धन्यवाद!! –

+3

आश्चर्यजनक रूप से यह मेरे लिए काम नहीं करता है। मुझे सामग्री नामों के चारों ओर उद्धरण जोड़ना था, इसे देखें: http://stackoverflow.com/questions/15638622/how-to-upload-files-to-asp-net-mvc-4-0-action-running-in -इस-एक्सप्रेस-साथ-httpcl/15638623 # 15638623 – deerchao

9

आपको HttpContent के विभिन्न उप-वर्गों की आवश्यकता है।

आप एक बहुरूप http सामग्री बनाते हैं और इसमें विभिन्न भागों को जोड़ते हैं। आपके मामले में आप इनकोडिंग एक बाइट सरणी सामग्री और रूप यूआरएल की तर्ज पर है:

HttpClient c = new HttpClient(); 
var fileContent = new ByteArrayContent(new byte[100]); 
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
              { 
               FileName = "myFilename.txt" 
              }; 

var formData = new FormUrlEncodedContent(new[] 
              { 
               new KeyValuePair<string, string>("name", "ali"), 
               new KeyValuePair<string, string>("title", "ostad") 
              }); 


MultipartContent content = new MultipartContent(); 
content.Add(formData); 
content.Add(fileContent); 
c.PostAsync(myUrl, content); 
+1

यह दुर्भाग्य से काम नहीं करता है, हालांकि 'ContentDisposition' शीर्षलेख मुझे एक कदम आगे ले जाने लगता है। यदि मैं आपके नमूना कोड का उपयोग करता हूं, तो मुझे 'असमर्थित मीडिया प्रकार' अपवाद मिलता है। हालांकि, अगर मैं 'मल्टीपार्टफॉन्टेंट' को 'मल्टीपार्टफॉर्मडाटाकंट' के साथ बदलता हूं तो अपवाद दूर हो जाता है। सर्वर पर, हालांकि, छिपे हुए क्षेत्र का मान गुम है। –

+0

@MichaelTeper मैंने कोड का परीक्षण नहीं किया है। मैं इसके साथ थोड़ा सा खेलूँगा और पोस्ट अपडेट करूँगा, लेकिन मेरा पॉइंट आपको एक काम करने वाला कोड नहीं दिखाना था, जो आपको देखने की ज़रूरत है, न कि एक कामकाजी कोड। – Aliostad

7

धन्यवाद @Michael आपके उत्तर के लिए टेपर।

मुझे मेलगुन (ईमेल प्रदाता) को अनुलग्नक पोस्ट करना पड़ा और मुझे इसे थोड़ा संशोधित करना पड़ा ताकि यह मेरे अनुलग्नकों को स्वीकार कर सके।

var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName)); 
fileContent.Headers.ContentDisposition = 
     new ContentDispositionHeaderValue("form-data") //<- 'form-data' instead of 'attachment' 
{ 
    Name = "attachment", // <- included line... 
    FileName = "Foo.txt", 
}; 
multipartFormDataContent.Add(fileContent); 

भविष्य के संदर्भ के लिए यहां। धन्यवाद।

संबंधित मुद्दे