MultipartForm.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using System.Collections.Generic;
  2. using Microsoft.AspNetCore.WebUtilities;
  3. using Microsoft.Net.Http.Headers;
  4. using System.IO;
  5. using System.Threading.Tasks;
  6. namespace Vit.Net.Http.FormFile
  7. {
  8. /*
  9. * https://www.cnblogs.com/liuxiaoji/p/10266609.html
  10. *
  11. <ItemGroup>
  12. <PackageReference Include = "Microsoft.AspNetCore.Http" Version="2.2.2" />
  13. <PackageReference Include = "Microsoft.Net.Http.Headers" Version="2.2.8" />
  14. </ItemGroup>
  15. */
  16. public class FormFile
  17. {
  18. /// <summary>
  19. /// 文件在form中的name(如 "files")
  20. /// </summary>
  21. public string formKey;
  22. /// <summary>
  23. /// 上传文件时的文件名称(含后缀 如 "user.jpg")
  24. /// </summary>
  25. public string fileName;
  26. /// <summary>
  27. /// 文件的二进制正文内容
  28. /// </summary>
  29. public byte[] content;
  30. }
  31. /// <summary>
  32. ///
  33. /// </summary>
  34. public class MultipartForm
  35. {
  36. public Dictionary<string,string> form { get; private set; }
  37. public List<FormFile> files { get; private set; }
  38. public MultipartForm(Stream Body, string ContentType)
  39. {
  40. ReadMultipartForm(this, Body, ContentType);
  41. }
  42. public MultipartForm(byte[] Body, string ContentType)
  43. {
  44. using (var stream = new MemoryStream(Body))
  45. {
  46. ReadMultipartForm(this, stream, ContentType);
  47. }
  48. }
  49. #region ReadMultipartForm
  50. private static async Task<MultipartForm> ReadMultipartForm(MultipartForm formData,Stream Body, string ContentType)
  51. {
  52. var boundary = HeaderUtilities.RemoveQuotes(MediaTypeHeaderValue.Parse(ContentType).Boundary).Value;
  53. var reader = new MultipartReader(boundary, Body);
  54. formData.files = new List<FormFile>();
  55. formData.form = new Dictionary<string, string>();
  56. MultipartSection section;
  57. while ((section = await reader.ReadNextSectionAsync()) != null)
  58. {
  59. ContentDispositionHeaderValue contentDisposition = section.GetContentDispositionHeader();
  60. if (contentDisposition == null) continue;
  61. if (contentDisposition.IsFileDisposition())
  62. {
  63. var file = section.AsFileSection();
  64. byte[] buff;
  65. using (var stream = new MemoryStream())
  66. {
  67. await section.Body.CopyToAsync(stream);
  68. //await file.FileStream.CopyToAsync(stream);
  69. buff = stream.ToArray();
  70. }
  71. formData.files.Add(new FormFile { formKey = file.Name, fileName = contentDisposition.FileName.ToString(), content = buff });
  72. }
  73. else if (contentDisposition.IsFormDisposition())
  74. {
  75. var form = section.AsFormDataSection();
  76. formData.form[form.Name] = await form.GetValueAsync();
  77. }
  78. }
  79. return formData;
  80. }
  81. #endregion
  82. }
  83. }