昨天分享了一個在WebApi中如何接收參數的文章 傳送門,然後有新人小伙伴就問了,那文件上傳呢,這個怎麼弄,藉此我寫了一個小demo,分享給大家。 通常來說,上傳文件,我們是使用POST,還是老規矩先上代碼: txt文件 這是需要上傳的txt文件。 指定文件參數名 代碼 [HttpPost("Upl ...
昨天分享了一個在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; }
示例
關於文件上傳,在微軟的官網中也有對應的文檔,感興趣的小伙伴可以去看看,傳送門,感謝各位的閱讀,有任何問題歡迎評論區留言!
本文來自博客園,作者:一事冇誠,轉載請註明原文鏈接:https://www.cnblogs.com/ysmc/p/17666170.html