這篇文章將為大家詳細講解有關如何在asp.net core中使用webapi實現(xiàn)一個文件上傳功能,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
十余年專注成都網(wǎng)站制作,企業(yè)網(wǎng)站建設,個人網(wǎng)站制作服務,為大家分享網(wǎng)站制作知識、方案,網(wǎng)站設計流程、步驟,成功服務上千家企業(yè)。為您提供網(wǎng)站建設,網(wǎng)站制作,網(wǎng)頁設計及定制高端網(wǎng)站建設服務,專注于企業(yè)網(wǎng)站建設,高端網(wǎng)頁制作,對石牌坊等多個方面,擁有豐富的網(wǎng)站營銷經(jīng)驗。使用默認模板創(chuàng)建webapi的controller后,post請求,默認有
// POST api/values [HttpPost] public void Post([FromBody]string value) { }
請求使用了[FromBody]
標記,用來指示用請求體里獲得數(shù)據(jù)。
對于文件上傳請求,直接在這個Post函數(shù)里使用Request.Form.Files
是不行的,無法成功路由。
典型上傳,需要設置前端發(fā)送的請求Content-Type
為multipart/form-data
,然后在控制器類加上特性修飾:
[Produces("application/json")] [Consumes("application/json", "multipart/form-data")]//此處為新增 [Route("api/[controller]")] public class FileController : Controller
指示該controller能夠接受multipart/form-data
形式的數(shù)據(jù)。對應的,修改post的代碼如下:
// POST: api/File [HttpPost] public TaskPost(IFormCollection files)
這里需要注意,使用的是IFormCollection。這是IForm的類型集合,實際上就是Request.Form
。
注意,很多地方寫了可以使用IFormFile,直接寫成
// POST: api/File [HttpPost] public TaskPost(IFormFile file)
實際測試沒有辦法獲取到對象,file常態(tài)為null,或者是我方法不對。
然后就可以在post方法里面使用files.Files來枚舉文件了,每個文件都是一個IFormFile對象,可以靈活使用FileName, Name,Length等常用屬性。當然,我們也可以不帶參數(shù):
// POST: api/File [HttpPost] public TaskPost()
直接使用Request.Form.Files獲得文件數(shù)據(jù)。
P.S. 對于IFormFile,與System.IO.File
對象不同,IFormFile缺少很多方法,只提供OpenReadStream()
方法,該方法返回一個stream對象。很多讀文件的API都可以接受stream作為FilePath的替代。
一般的文件上傳請求,不單上傳文件數(shù)據(jù),通常還需要上傳其他文件信息數(shù)據(jù)(比如文件類型,上傳者等等)。修改一下post方法,改成這樣:
[HttpPost] public TaskPost([FromBody]string type,IFormCollection files)
將type都打包進請求,再次發(fā)送。發(fā)現(xiàn)......type是null。
MSDN說了,The reason for this rule is that the request body might be stored in a non-buffered stream that can only be read once.
所以,[FromBody]只能加一個,但是我這確實也只加了一個,有問題?很明顯,那個IFormCollection也是默認通過[FromBody]解析的,所以正確的方法是不加[FromBody]了。
[HttpPost] public TaskPost(string type,IFormCollection files)
關于如何在asp.net core中使用webapi實現(xiàn)一個文件上傳功能就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。