2009-07-30 180 views
14

從C#提交多部分/表單數據內容類型的HTTP POST請求最簡單的方法是什麼?必須有比建立我自己的要求更好的方法。如何提交來自C#的多部分/表單數據HTTP POST請求?

我問的原因是使用此API將照片上傳到Flickr:

所有的

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 – 2009-07-30 00:31:29

+0

這個問題有一個答案,使用WebRequest發佈多部分/表單數據解決了您的問題。它運作良好。 http://stackoverflow.com/questions/219827/multipart-forms-from-c-client – Marek 2010-01-05 16:27:17

回答

1

首先,這有什麼錯純手工執行使用.NET框架的HTTP命令。請記住它是一個框架,它應該是非常通用的。

其次,我想你可以嘗試在.Net中搜索瀏覽器實現。我看到了this one,或許它涵蓋了你問到的問題。或者您可以搜索「C# http put get post request」。其中一個結果導致一個非免費的庫,可能會有幫助(Chilkat http)

如果你碰巧在.net上編寫自己的HTTP命令框架 - 我想我們都可以享受它,如果你分享它:-)

+0

不幸的是,這是我不得不做的。 – 2009-08-02 06:08:55

1

System.Net.WebClient類可能是你在找什麼。查看WebClient.UploadFile的文檔,它應該允許您通過UploadFile重載之一將文件上載到指定的資源。我認爲這是你正在尋找用來發布數據的方法...

它可以用來像....請注意,這不是測試只是示例代碼...

Web客戶端Web客戶端=新Web客戶端();

webClient.UploadFile(「http://www.url.com/ReceiveUploadedFile.aspx」,「POST」,@「c:\ myfile.txt」);

這裏是MSDN的參考,如果你有興趣。

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

希望這有助於。

+1

這會工作,如果我只是上傳文件。但是,我需要包含一堆其他表單變量。 – 2009-07-30 23:57:43

2

我已經成功發佈了代碼aspnetupload.com。我最終創建了自己的與Compact Framework兼容的UploadHelper庫。運作良好,似乎完全符合你的要求。

+0

我應該添加「自己創建版本」==嘗試在Compact Framework項目中編譯庫,查看破壞的內容,使用另一個與CF兼容的對象或代碼段來做同樣的事情,重複一遍。我對這個過程的簡單程度感到驚喜。 – 2011-04-19 22:17:45

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; 
       } 
      } 
     } 
2

我還沒有嘗試過這個自己,但似乎在C#這是一個內置的方式(雖然不是很知道一個很明顯...):

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 
    } 
} 

試一試,讓我知道它是怎麼回事。

乾杯!

相關問題