2009-07-30 6 views
14

से मल्टीपार्ट/फॉर्म-डेटा HTTP पोस्ट अनुरोध कैसे सबमिट करें सी # से मल्टीपार्ट/फॉर्म-डेटा सामग्री प्रकार के साथ HTTP POST अनुरोध सबमिट करने का सबसे आसान तरीका क्या है? अपना खुद का अनुरोध बनाने से बेहतर तरीका होना चाहिए। नेट ढांचे का उपयोग कर HTTP आदेशों की शुद्ध मैनुअल कार्यान्वयन के साथ कुछ भी गलत नहीं हैसी #

सभी की

http://www.flickr.com/services/api/upload.api.html

+1

मैं मुख्य रूप से HttpWebRequest को देख रहा हूं, लेकिन इंटरनेट पर जो भी संसाधन मिला है, वह बताता है कि मैन्युअल रूप से अनुरोध कैसे बनाया जाए। यहां मैंने पाया है कि कई समान उदाहरणों में से एक है: http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/03efc98c-68e2-410c-bf25-d5facacbd920 –

+0

इस प्रश्न का एक उत्तर है WebRequest का उपयोग कर मल्टीपार्ट/फॉर्म-डेटा पोस्ट करने के साथ आपकी समस्या हल करता है। यह अच्छा काम करता है। http://stackoverflow.com/questions/219827/multipart-forms-from-c-client – Marek

उत्तर

1

पहले,:

कारण मैं पूछ रहा हूँ इस API का उपयोग फ़्लिकर तस्वीरें अपलोड करने के लिए है। ध्यान रखें कि यह एक ढांचा है, और यह बहुत सामान्य होना चाहिए।

दूसरा, मुझे लगता है कि आप .NET में ब्राउज़र कार्यान्वयन की खोज करने का प्रयास कर सकते हैं। मैंने this one देखा, शायद यह आपके द्वारा पूछे गए मुद्दे को शामिल करता है। या आप बस "C# http put get post request" खोज सकते हैं। परिणामों में से एक गैर-मुक्त लाइब्रेरी की ओर जाता है जो उपयोगी हो सकता है (Chilkat एचटीपी)

यदि आप .NET के शीर्ष पर HTTP कमांड का अपना ढांचा लिखना चाहते हैं - मुझे लगता है कि यदि आप साझा करते हैं तो हम सभी इसका आनंद ले सकते हैं यह :-)

+0

अफसोस की बात है, मुझे यही करना है। –

1

System.Net.WebClient क्लास जो आप खोज रहे हैं वह हो सकता है। WebClient.UploadFile के लिए प्रलेखन की जांच करें, यह आपको अपलोडफाइल ओवरलोड में से किसी एक के माध्यम से एक निर्दिष्ट संसाधन में फ़ाइल अपलोड करने की अनुमति देनी चाहिए। मुझे लगता है कि इस प्रक्रिया में डेटा पोस्ट करने के लिए उपयोग करने के लिए देख रहे है ...

यह .... ध्यान दें कि यह नहीं परीक्षण किया सिर्फ नमूना कोड है ...

WebClient WebClient की तरह इस्तेमाल किया जा सकता = नई WebClient();

webClient.UploadFile ("http://www.url.com/ReceiveUploadedFile.aspx", "पोस्ट", @ "c: \ myfile.txt");

यदि आप रुचि रखते हैं तो एमएसडीएन संदर्भ यहां है।

http://msdn.microsoft.com/en-us/library/system.net.webclient.uploadfile.aspx

आशा इस मदद करता है।

+1

यह काम करेगा अगर मैं सिर्फ फाइल अपलोड करूँगा। हालांकि, मुझे इसके साथ अन्य फॉर्म चर के समूह को शामिल करने की आवश्यकता है। –

2

मुझे aspnetupload.com पर पोस्ट कोड के साथ सफलता मिली है। मैंने अपनी अपलोडहेल्पर लाइब्रेरी का अपना संस्करण बना दिया जो कॉम्पैक्ट फ्रेमवर्क के साथ संगत है। अच्छा काम करता है, ऐसा लगता है कि आपको वही करना है जो आपको चाहिए।

+0

मुझे यह जोड़ना चाहिए कि "अपना खुद का संस्करण बनाएं" == कॉम्पैक्ट फ्रेमवर्क प्रोजेक्ट में लाइब्रेरी को संकलित करने का प्रयास करें, देखें कि क्या टूटा हुआ है, एक ही काम करने के लिए एक और सीएफ-संगत ऑब्जेक्ट या कोड सेगमेंट का उपयोग करें, दोहराएं। मैं आश्चर्यचकित था कि प्रक्रिया कितनी सरल थी। –

5

आप .NET 4.5 इस प्रयोग के प्रयोग कर रहे हैं:

public string Upload(string url, NameValueCollection requestParameters, MemoryStream file) 
     { 

      var client = new HttpClient(); 
      var content = new MultipartFormDataContent(); 

      content.Add(new StreamContent(file)); 
      System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<string, string>> b = new List<KeyValuePair<string, string>>(); 
      b.Add(requestParameters); 
      var addMe = new FormUrlEncodedContent(b); 

      content.Add(addMe); 
      var result = client.PostAsync(url, content); 
      return result.Result.ToString(); 
     } 

अन्यथा रयान के जवाब के आधार पर, मैं पुस्तकालय डाउनलोड किया है और यह थोड़ा बदलाव किया।

public class MimePart 
     { 
      NameValueCollection _headers = new NameValueCollection(); 
      byte[] _header; 

      public NameValueCollection Headers 
      { 
       get { return _headers; } 
      } 

      public byte[] Header 
      { 
       get { return _header; } 
      } 

      public long GenerateHeaderFooterData(string boundary) 
      { 
       StringBuilder sb = new StringBuilder(); 

       sb.Append("--"); 
       sb.Append(boundary); 
       sb.AppendLine(); 
       foreach (string key in _headers.AllKeys) 
       { 
        sb.Append(key); 
        sb.Append(": "); 
        sb.AppendLine(_headers[key]); 
       } 
       sb.AppendLine(); 

       _header = Encoding.UTF8.GetBytes(sb.ToString()); 

       return _header.Length + Data.Length + 2; 
      } 

      public Stream Data { get; set; } 
     } 

     public string Upload(string url, NameValueCollection requestParameters, params MemoryStream[] files) 
     { 
      using (WebClient req = new WebClient()) 
      { 
       List<MimePart> mimeParts = new List<MimePart>(); 

       try 
       { 
        foreach (string key in requestParameters.AllKeys) 
        { 
         MimePart part = new MimePart(); 

         part.Headers["Content-Disposition"] = "form-data; name=\"" + key + "\""; 
         part.Data = new MemoryStream(Encoding.UTF8.GetBytes(requestParameters[key])); 

         mimeParts.Add(part); 
        } 

        int nameIndex = 0; 

        foreach (MemoryStream file in files) 
        { 
         MimePart part = new MimePart(); 
         string fieldName = "file" + nameIndex++; 

         part.Headers["Content-Disposition"] = "form-data; name=\"" + fieldName + "\"; filename=\"" + fieldName + "\""; 
         part.Headers["Content-Type"] = "application/octet-stream"; 

         part.Data = file; 

         mimeParts.Add(part); 
        } 

        string boundary = "----------" + DateTime.Now.Ticks.ToString("x"); 
        req.Headers.Add(HttpRequestHeader.ContentType, "multipart/form-data; boundary=" + boundary); 

        long contentLength = 0; 

        byte[] _footer = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n"); 

        foreach (MimePart part in mimeParts) 
        { 
         contentLength += part.GenerateHeaderFooterData(boundary); 
        } 

        //req.ContentLength = contentLength + _footer.Length; 

        byte[] buffer = new byte[8192]; 
        byte[] afterFile = Encoding.UTF8.GetBytes("\r\n"); 
        int read; 

        using (MemoryStream s = new MemoryStream()) 
        { 
         foreach (MimePart part in mimeParts) 
         { 
          s.Write(part.Header, 0, part.Header.Length); 

          while ((read = part.Data.Read(buffer, 0, buffer.Length)) > 0) 
           s.Write(buffer, 0, read); 

          part.Data.Dispose(); 

          s.Write(afterFile, 0, afterFile.Length); 
         } 

         s.Write(_footer, 0, _footer.Length); 
         byte[] responseBytes = req.UploadData(url, s.ToArray()); 
         string responseString = Encoding.UTF8.GetString(responseBytes); 
         return responseString; 
        } 
       } 
       catch 
       { 
        foreach (MimePart part in mimeParts) 
         if (part.Data != null) 
          part.Data.Dispose(); 

        throw; 
       } 
      } 
     } 
+1

पहला फ़ंक्शन काम नहीं करता है। क्या है एक"? – user656822

+0

ओह, अनुरोध पैरामीटर होना चाहिए था। फिक्स्ड। –

+0

मुझे पता है कि यह पुराना है, लेकिन यह तब तक मेरे लिए काम नहीं करता जब तक कि मैंने अपनी सामग्री को मैन्युअल रूप से यहां तक ​​नहीं देखा -> http://stackoverflow.com/a/12034014/885338 – Arikael

-1

मैं सामान्य रूप से Fiddler कि इस काम के लिए सबसे अच्छा साधन हो पाते हैं। अनुरोध बनाने में बहुत आसानी है और यह आपके लिए कुछ शीर्षलेख भी उत्पन्न करता है।

Fiddler - How to create a request

enter image description here

2

मैं अपने आप को इस प्रयास नहीं किया है, लेकिन इसके लिए सी # में निर्मित एक तरीका है (हालांकि नहीं जाहिरा तौर पर एक बहुत ही जाना जाता है एक है ...):

private static HttpClient _client = null; 

private static void UploadDocument() 
{ 
    // Add test file 
    var httpContent = new MultipartFormDataContent(); 
    var fileContent = new ByteArrayContent(File.ReadAllBytes(@"File.jpg")); 
    fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
    { 
     FileName = "File.jpg" 
    }; 

    httpContent.Add(fileContent); 
    string requestEndpoint = "api/Post"; 

    var response = _client.PostAsync(requestEndpoint, httpContent).Result; 

    if (response.IsSuccessStatusCode) 
    { 
     // ... 
    } 
    else 
    { 
     // Check response.StatusCode, response.ReasonPhrase 
    } 
} 

इसे आज़माएं और मुझे बताएं कि यह कैसा चल रहा है।

चीयर्स!