簡體   English   中英

C# IFormFile 包裝接口

[英]C# IFormFile wrapper interface

我覺得這是一件很容易做的事情,但由於某種原因,在我的代碼中,我得到了 null 值。

前端為 Angular,后端為 C# .NET。

我正在發帖上傳formData。 提交表單並進行 POST 以將圖像上傳到 blob 容器時,我的問題正在發生。

當用戶上傳照片並提交表單時,照片將轉換為 base64 圖像。 並且在 imageFile 中添加了一個自定義屬性:

這是帖子數據

File{
    isThumbnail: false, 
    name: "Forest-Village.jpg", 
    lastModified: 1638304459833, 
    size: 205605, 
    type: "image/jpeg", 
    lastModifiedDate: Tue Nov 30 2021 15:34:19 GMT-0500 (Eastern Standard Time) {}, 
    webkitRelativePath: ""
}

我想在后端使用isThumbnail 但在后端,POST 僅在參數中的類型設置為ICollection<IFormFile>時有效

[HttpPost]
public async Task<ActionResult<IEnumerable<T>>> UploadPhotos([FromRoute] Guid Id, ICollection<IFormFile> files, CancellationToken cancellationToken = default){}

然后將在帖子的文件參數中獲得以下內容:

ContentDisposition: form-data; name="files"; filename="Forest-Village.jpg"
ContentType: "image/jpeg"
FileName: Forest-Village.jpg
Headers:{Microsoft.AspNetCore.Http.HeaderDictionary}
Length: 205605
Name: "files"

所以我缺少isThumbnail屬性。

IFormFile接口包含這些方法和屬性供參考:

namespace Microsoft.AspNetCore.Http
{
    // Summary:
    //     Represents a file sent with the HttpRequest.
    public interface IFormFile
    {
        string ContentType { get; }
        string ContentDisposition { get; }
        IHeaderDictionary Headers { get; }
        long Length { get; }
        string Name { get; }
        string FileName { get; }
        void CopyTo(Stream target);
        Task CopyToAsync(Stream target, CancellationToken cancellationToken = default);
        Stream OpenReadStream();
    }
}

所以我創建了這個IFormFileWrapper接口,並把它放在 [httpPost] 參數中:

[HttpPost]
public async Task<ActionResult<IEnumerable<T>>> UploadPhotos([FromRoute] Guid Id, ICollection<IFormFileWrapper> files, CancellationToken cancellationToken = default){}
public interface IFormFileWrapper : IFormFile
{ 
    bool IsThumbnail { get; }  
}

但它會在帖子的文件參數中給我null 所以它擊中了帖子,但沒有填充任何屬性。

到目前為止,我已經嘗試過:

  1. 在繼承 IFormFile 的同時,在 IFormFileWrapper 接口中不放置任何內容
  2. 在繼承 IFormFile 的同時將 IFormFile 屬性與 boolean 一起放入 IFormFileWrapper 接口
  3. 制作一個名為 FormFileWrapper 的 class 實現 IFormFileWrapper 和 IFormFile 的所有屬性

他們都打了post方法,但給了我null。

我理解 inheritance 錯了嗎? 或者它是如何從表單中反序列化內容的?

我沒有制作自定義活頁夾,而是將 isThumbnail 數組傳遞到 FormData javascript object 中。 它像字典一樣工作。 因此,當我創建實體時,我可以將它用於 IFormFiles。

if (!!uploadedPhotos && uploadedPhotos.length > 0) {
        let thumbnailValues = uploadedPhotos.map(p => p.isThumbnail)
        let uploadedFiles = uploadedPhotos.map(p => p.file);
        let formData = new FormData();
        uploadedFiles.forEach((f, index) => {
          formData.append("files", f);
          formData.append("isthumbnail", String(thumbnailValues[index]));
        });
        newImgs$ = this._imageService.postImages(this.Id, formData);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM