1. 程式人生 > 程式設計 >C# 使用HttpClient上傳檔案並附帶其他引數的步驟

C# 使用HttpClient上傳檔案並附帶其他引數的步驟

HttpClientMultipartFormDataContent(傳送門)最低適用於.NET Framework 4.5版本

傳送端程式碼

using (HttpClient client = new HttpClient())
{
  var content = new MultipartFormDataContent();
  //新增字串引數,引數名為qq
  content.Add(new StringContent("123456"),"qq");

  string path = Path.Combine(System.Environment.CurrentDirectory,"1.png");
  //新增檔案引數,引數名為files,檔名為123.png
  content.Add(new ByteArrayContent(System.IO.File.ReadAllBytes(path)),"file","123.png");

  var requestUri = "http://192.168.1.108:56852/api/Test/SaveFile";
  var result = client.PostAsync(requestUri,content).Result.Content.ReadAsStringAsync().Result;

  Console.WriteLine(result);
}

接收端程式碼

[HttpPost]
public async Task<JsonResult> SaveFile([FromForm]string qq,IFormFile file)
{
  return await Task.Run(() =>
  {
    try
    {
      //儲存檔案到本地
      var filefullPath = Path.Combine(Directory.GetCurrentDirectory(),file.FileName);
      using (FileStream fs = new FileStream(filefullPath,FileMode.Create))
      {
        file.CopyTo(fs);
        fs.Flush();
      }
    }
    catch (Exception ex)
    {
      return Fail(file.FileName + "---" + ex.Message);
    }
    return Success();
  });
}

注意:如果要通過引數形式接收資料,需要確保引數名稱和上面傳送請求中設定的名稱一致,否則無法自動繫結到引數中,且需要給引數加上[FromForm]的標記。

使用model物件接收資料

public class SaveFileModel
{
  public string qq { get; set; }
  public IFormFile File { get; set; }
}
public async Task<JsonResult> SaveFile([FromForm]SaveFileModel model)
{
  //......
}

使用HttpContext從請求的Form中獲取資料

public async Task<JsonResult> SaveFile()
{
  return await Task.Run(() =>
  {
    var files = HttpContext.Request.Form.Files;
    var qq = HttpContext.Request.Form["qq"];
    //......
  });
}

總結

這個問題是在寫一個.Net Core專案時遇到的,以前在.Net Framework 4.0的時候,使用string拼接表單中檔案的內容,到處都是boundary分界線。用MultipartFormDataContent來進行表單提交上傳檔案是它內部幫我們拼接了這個複雜的內容。(可以用Fiddler抓一下請求看看)emm...我去找一下當初是怎麼弄的檔案上傳,如果有再更新此文。

以上就是C# 使用HttpClient上傳檔案並附帶其他引數的步驟的詳細內容,更多關於C# 使用HttpClient上傳檔案的資料請關注我們其它相關文章!