asp.net core webapi文件上傳

来源:http://www.cnblogs.com/podolski/archive/2017/11/06/7795168.html
-Advertisement-
Play Games

最近開發一個新項目,使用了asp.net core 2.0,採用webapi開發後臺,postgresql為資料庫。最先來的問題就是上傳文件的問題。 POST文件的一些坑 使用預設模板創建webapi的controller後,post請求,預設有 請求使用了 標記,用來指示用請求體里獲得數據。 對於 ...


最近開發一個新項目,使用了asp.net core 2.0,採用webapi開發後臺,postgresql為資料庫。最先來的問題就是上傳文件的問題。


POST文件的一些坑

使用預設模板創建webapi的controller後,post請求,預設有

        // POST api/values
        [HttpPost]
        public void Post([FromBody]string value)
        {
        }

請求使用了[FromBody]標記,用來指示用請求體里獲得數據。

對於文件上傳請求,直接在這個Post函數里使用Request.Form.Files是不行的,無法成功路由。
典型上傳,需要設置前端發送的請求Content-Typemultipart/form-data,然後在控制器類加上特性修飾:

    [Produces("application/json")]
    [Consumes("application/json", "multipart/form-data")]//此處為新增
    [Route("api/[controller]")]
    public class FileController : Controller

指示該controller能夠接受multipart/form-data形式的數據。對應的,修改post的代碼如下:

        // POST: api/File
        [HttpPost]
        public Task<ActionResult> Post(IFormCollection files)

這裡需要註意,使用的是IFormCollection。這是IForm的類型集合,實際上就是Request.Form

註意,很多地方寫了可以使用IFormFile,直接寫成

        // POST: api/File
        [HttpPost]
        public Task<ActionResult> Post(IFormFile file)

實際測試沒有辦法獲取到對象,file常態為null,或者是我方法不對。

然後就可以在post方法裡面使用files.Files來枚舉文件了,每個文件都是一個IFormFile對象,可以靈活使用FileName, Name,Length等常用屬性。當然,我們也可以不帶參數:

        // POST: api/File
        [HttpPost]
        public Task<ActionResult> Post()

直接使用Request.Form.Files獲得文件數據。

P.S. 對於IFormFile,與System.IO.File對象不同,IFormFile缺少很多方法,只提供OpenReadStream()方法,該方法返回一個stream對象。很多讀文件的API都可以接受stream作為FilePath的替代。

同時上傳其他數據

一般的文件上傳請求,不單上傳文件數據,通常還需要上傳其他文件信息數據(比如文件類型,上傳者等等)。修改一下post方法,改成這樣:

        [HttpPost]
        public Task<ActionResult> Post([FromBody]string type,IFormCollection files)

將type都打包進請求,再次發送。發現......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 Task<ActionResult> Post(string type,IFormCollection files)

後記

回想起當年做WebService的時候,上傳文件寫的
多平臺上傳
,感觸頗多,以前是轉碼到base64,通過string發送,現在是直接類型識別...

BUT

他喵的還在傳文件啊,原地踏步啊,三年了難受!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MVC
    MVC ...
  • 用例圖用於描述系統提供的系列功能。使用用例圖的主要目的是幫助開發團隊以一種可視化的方式理解系統的功能需求。用例圖對系統的實現不做任何說明,僅僅是系統功能的描述。 用例圖主要在需求分析階段使用,用於描述系統實現的功能,方便與客戶交流,保證系統需求的無二性。 用例圖有四部分用例,角色,系統邊界,關係。 ...
  • Spring註入 重點還是看實例吧 實例: 有一個InjectionDao的介面,然後InjectionDaoImpl實現了InjectionDao介面,相當於完成了資料庫的操作。 有一個InjectonServer的介面,然後InjectonServerImpl實現了InjectonServer接 ...
  • 一、負載均衡集群介紹 1、集群 ① 集群(cluster)技術是一種較新的技術,通過集群技術,可以在付出較低成本的情況下獲得在性能、可靠性、靈活性方面的相對較高的收益,其任務調度則是集群系統中的核心技術。 ② 集群是一組相互獨立的、通過高速網路互聯的電腦,它們構成了一個組,並以單一系統的模式加以管 ...
  • 項目簡介和code見《同步非同步和阻塞2-測試小項目》 1. 實現 由於IO是阻塞的,所以要實現輪詢IO的結果,需要將IO放入線程中處理,IO的處理結果作為給線程的exit code返回。這裡用“CBaseThread”簡單的將線程處理函數封裝到類中 在OnStart()中,先依次啟動2個線程處理IO ...
  • 因為windows是不能引導linux的,而每次win10升級或恢復都會將linux的啟動引導覆蓋掉,導致無法進入linux, 所以一直就禁止了win10更新.這幾天win10出了點小毛病,所以就狠下心來恢復了系統, 好吧~_~ 這下嗝屁了,ubuntu進不去了.裡面保存了不少資料,實在是不想重裝, ...
  • Linux/Unix 命令格式: 命令名 [選項] [參數] 註:[]中的內容代表內容可以省略 例:$ ls $ ls -l #-l 是選項 開始符號: 文件名 或 文件夾名 .當前文件夾 ..上一級文件夾 ~用戶主目錄(家目錄) 查看類: pwd命令: 使用: 用於顯示當前操作的位置的路徑(當前工 ...
  • 新的剛來到,舊的就忘掉。學習 AspNet Core 2.0,沒有好的例子,是很痛苦的。《Pro ASP.NET Core MVC 2》中的 SportsStore 值得一看,不妨下載研究一下: 準備 1. 使用 Ubuntu 系統 2. 安裝 NetCore2.0 3. 安裝 VSCode 4. ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...