2013-05-07 98 views
73

有誰知道如何使用.net 4.5中的HttpClientmultipart/form-data上傳?C#HttpClient 4.5 multipart/form-data upload

我在互聯網上找不到任何示例。

async public Task<HttpResponseMessage> UploadImage(string url, byte[] ImageData) 
{ 
    var requestContent = new MultipartFormDataContent(); 
    // here you can specify boundary if you need---^ 
    var imageContent = new ByteArrayContent(ImageData); 
    imageContent.Headers.ContentType = 
     MediaTypeHeaderValue.Parse("image/jpeg"); 

    requestContent.Add(imageContent, "image", "image.jpg"); 

    return await client.PostAsync(url, requestContent); 
} 

(您可以requestContent.Add()任何你想要的,看看在HttpContent descendant以查看可用的類型傳遞):

+1

我try'd,但我還沒有任何想法如何啓動它..我在哪裏添加byteArray內容等。我需要一種開始幫助。 – ident 2013-05-07 10:27:55

回答

89

我的結果是這樣的:

public static async Task<string> Upload(byte[] image) 
{ 
    using (var client = new HttpClient()) 
    { 
     using (var content = 
      new MultipartFormDataContent("Upload----" + DateTime.Now.ToString(CultureInfo.InvariantCulture))) 
     { 
      content.Add(new StreamContent(new MemoryStream(image)), "bilddatei", "upload.jpg"); 

       using (
       var message = 
        await client.PostAsync("http://www.directupload.net/index.php?mode=upload", content)) 
       { 
        var input = await message.Content.ReadAsStringAsync(); 

        return !string.IsNullOrWhiteSpace(input) ? Regex.Match(input, @"http://\w*\.directupload\.net/images/\d*/\w*\.[a-z]{3}").Value : null; 
       } 
      } 
    } 
} 
+2

哇,在將大文件上傳到REST API時執行此操作非常簡單。我不想評論謝謝,但謝謝。它適用於Windows Phone 8. – 2013-06-25 08:50:09

+19

請注意,'HttpClient'旨在儘可能地在您的應用程序中重複使用。用'using'語句包裝它被認爲是不好的做法。這已被記錄在許多博客文章和書籍上。這是我最喜歡的關於這個主題的閱讀:http://chimera.labs.oreilly.com/books/1234000001708/ch14.html – 2016-09-01 07:14:19

+1

這段代碼失敗了,因爲邊界字符串被傳遞給'new MultipartFormDataContent(...)'一個無效的邊界字符(也許是「/」分隔符)。沒有錯誤,只是沒有文件發佈到服務器 - 在我的情況下,Context.Request.Files.Count = 0在API控制器。可能只是一個'Nancy'問題,但我建議使用'DateTime.Now.Ticks.ToString(「x」)''來代替。 – Dunc 2017-09-04 12:41:58

56

它(使用圖像/ JPG文件的例子)的作品或多或少像這樣

完成後,您會在HttpResponseMessage.Content內找到您可以通過HttpContent.ReadAs*Async消費的響應內容。

+0

謝謝,我在你的帖子前一週解決了這個問題,不過謝謝你。 – ident 2013-05-16 19:32:42

+0

爲什麼image.jpg? – Toolkit 2015-06-12 03:14:12

+1

Ahhh謝謝你們在這裏指定邊界,如果你需要--- ^':) – sfarbota 2015-09-10 07:14:36

32

這是如何使用MultipartFormDataContent發佈的HTTPClient字符串和文件流的例子。 Content-Disposition和Content-Type需要爲每個HTTPContent指定:

這是我的例子。希望它有幫助:

private static void Upload() 
{ 
    using (var client = new HttpClient()) 
    { 
     client.DefaultRequestHeaders.Add("User-Agent", "CBS Brightcove API Service"); 

     using (var content = new MultipartFormDataContent()) 
     { 
      var path = @"C:\B2BAssetRoot\files\596086\596086.1.mp4"; 

      string assetName = Path.GetFileName(path); 

      var request = new HTTPBrightCoveRequest() 
       { 
        Method = "create_video", 
        Parameters = new Params() 
         { 
          CreateMultipleRenditions = "true", 
          EncodeTo = EncodeTo.Mp4.ToString().ToUpper(), 
          Token = "x8sLalfXacgn-4CzhTBm7uaCxVAPjvKqTf1oXpwLVYYoCkejZUsYtg..", 
          Video = new Video() 
           { 
            Name = assetName, 
            ReferenceId = Guid.NewGuid().ToString(), 
            ShortDescription = assetName 
           } 
         } 
       }; 

      //Content-Disposition: form-data; name="json" 
      var stringContent = new StringContent(JsonConvert.SerializeObject(request)); 
      stringContent.Headers.Add("Content-Disposition", "form-data; name=\"json\""); 
      content.Add(stringContent, "json"); 

      FileStream fs = File.OpenRead(path); 

      var streamContent = new StreamContent(fs); 
      streamContent.Headers.Add("Content-Type", "application/octet-stream"); 
      //Content-Disposition: form-data; name="file"; filename="C:\B2BAssetRoot\files\596090\596090.1.mp4"; 
      streamContent.Headers.Add("Content-Disposition", "form-data; name=\"file\"; filename=\"" + Path.GetFileName(path) + "\""); 
      content.Add(streamContent, "file", Path.GetFileName(path)); 

      //content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 

      Task<HttpResponseMessage> message = client.PostAsync("http://api.brightcove.com/services/post", content); 

      var input = message.Result.Content.ReadAsStringAsync(); 
      Console.WriteLine(input.Result); 
      Console.Read(); 
     } 
    } 
} 
+6

@Trout你不知道你的代碼如何讓我如此快樂! +1 – Pinch 2015-06-01 18:41:14

+4

這是完整的答案。 – 2016-09-13 10:37:57

+1

我知道我們不應該評論一封感謝信。但是,這裏就是我見過的關於如何使用'MultipartFormDataContent'的最好的代碼。榮譽給你先生 – sebagomez 2016-10-04 15:24:37

5

這是一個完整的示例,爲我工作。 .NET中自動添加請求中的boundary值。

var url = "http://localhost/api/v1/yourendpointhere"; 
var filePath = @"C:\path\to\image.jpg"; 

HttpClient httpClient = new HttpClient(); 
MultipartFormDataContent form = new MultipartFormDataContent(); 

FileStream fs = File.OpenRead(filePath); 
var streamContent = new StreamContent(fs); 

var imageContent = new ByteArrayContent(streamContent.ReadAsByteArrayAsync().Result); 
imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); 

form.Add(imageContent, "image", Path.GetFileName(filePath)); 
var response = httpClient.PostAsync(url, form).Result; 
+0

我們該如何發送令牌?請參閱此:https://stackoverflow.com/questions/48295877/webclient-too-many-automatic-redirections-were-attempted – 2018-01-17 15:36:24