.NET Core WebAPI 基礎 檔案上傳

2023-08-30 06:00:47

  昨天分享了一個在WebApi中如何接收引數的文章 傳送門,然後有新人小夥伴就問了,那檔案上傳呢,這個怎麼弄,藉此我寫了一個小demo,分享給大家。

  通常來說,上傳檔案,我們是使用POST,還是老規矩先上程式碼:

txt檔案

這是需要上傳的txt檔案。

指定檔案引數名

程式碼

[HttpPost("UploaFile")]
public async Task<Dictionary<string, string>> UploadFileAsync(IEnumerable<IFormFile> files)
{
    var fileStream = files.FirstOrDefault()?.OpenReadStream();
    var fileContent = new StringBuilder();
    if (fileStream != null)
    {
        using var reader = new StreamReader(fileStream!);
        while (reader.Peek() >= 0)
        {
            fileContent.AppendLine(await reader.ReadLineAsync());
        }
    }

    var result = new Dictionary<string, string>()
    {
        ["fileContent"] = fileContent.ToString()
    };

    return result;
}

呼叫範例

  這裡有一個需要注意的地方,就是上傳檔案的引數名,需要跟介面的入參名一致,也就是 files,我們使用的型別為 IEnumerable<IFormFile>,主要是 IFormFile 這個,因為我們上傳的檔案可能不止一個,所以這裡使用了集合,要是不喜歡 IEnumerable,換成 List 也是可以的;

不指定檔案引數名

  而在實際開發中,我們可能會碰到前端不配合,或者引數名改來改去,我們後端又不想頻繁更改,那怎麼辦呢,此時我們可以使用以下的方法,不過我個人不太建議,還是好好溝通的好,不然別人看到你的介面檔案,例如swagger,都不知道你這個介面是上傳檔案的。

程式碼

[HttpPost("UploaFile2")]
public async Task<Dictionary<string, string>> UploadFile2Async()
{            
    var fileStream = HttpContext.Request.Form.Files.FirstOrDefault()?.OpenReadStream();
    var fileContent = new StringBuilder();
    if (fileStream != null)
    {
        using var reader = new StreamReader(fileStream!);
        while (reader.Peek() >= 0)
        {
            fileContent.AppendLine(await reader.ReadLineAsync());
        }
    }

    var result = new Dictionary<string, string>()
    {
        ["fileContent"] = fileContent.ToString()
    };

    return result;
}

範例

   可以看到,結果是一樣的。

混合

  而同樣是一個POST請求,自然是可以通過url,route,from這些傳參啦!

程式碼

[HttpPost("{method}/{value}/UploaFile")]
public async Task<Dictionary<string, object>> UploadFileAsync(
    [FromRoute] Parameter route,
    [FromQuery] Parameter query,
    [FromForm] Parameter form,
    IEnumerable<IFormFile> files)
{
    var fileStream = files.FirstOrDefault()?.OpenReadStream();
    var fileContent = new StringBuilder();
    if (fileStream != null)
    {
        using var reader = new StreamReader(fileStream!);
        while (reader.Peek() >= 0)
        {
            fileContent.AppendLine(await reader.ReadLineAsync());
        }
    }

    var result = new Dictionary<string, object>()
    {
        ["route"] = route,
        ["query"] = query,
        ["form"] = form,
        ["fileContent"] = fileContent.ToString()
    };

    return result;
}

範例

 關於檔案上傳,在微軟的官網中也有對應的檔案,感興趣的小夥伴可以去看看,傳送門,感謝各位的閱讀,有任何問題歡迎評論區留言!