日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

想说爱你不容易 | 使用最小 WEB API 实现文件上传

發布時間:2023/12/4 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 想说爱你不容易 | 使用最小 WEB API 实现文件上传 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在 .NET 6 之前,實現文件上傳功能十分簡單:

[HttpPost("upload")] public?async?Task<IActionResult>?Upload(IFormFile?file) {//對file執行操作return?Ok(file.FileName); }

但是,當使用 .NET 6 的最小 WEB API 來實現相同功能時,卻意外地遇到了不少坑。

實現代碼

轉換為最小 WEB API 來實現后,代碼是這樣的:

app.MapPost("/upload",?async?(IFormFile?file)?=> {return?Results.Ok(file.FileName); });

但是,在使用相同的客戶端代碼調用時,卻返回了 HTTP 415 錯誤:

允許 Content Type

這是由于上傳文件時,使用的 Content-Type 不是默認的 application/json,而是 multipart/form-data

在 dotnet/aspnetcore 的 issues 中,我們找到了相關解決方案(https://github.com/dotnet/aspnetcore/issues/35082):

修改代碼如下:

app.MapPost("/upload",?async?(IFormFile?file)?=> {return?Results.Ok(file.FileName); }).Accepts<IFormFile>("multipart/form-data");

結果,還是返回了415錯誤。更奇怪的是,多出來了一堆錯誤堆棧信息:

驚現 BUG

于是,想通過查看代碼方式找到問題。

使用錯誤信息“Expected a supported JSON media type but got”,我們定位到了源代碼文件 Http/Http.Extensions/src/RequestDelegateFactory.cs:

但是,發現 master 分支和 v6.0.0 分支的代碼,差別巨大。比如,master 分支有 IFormFile 相關代碼,而 v6.0.0 上完全沒有:

查看該文件的提交歷史,我們找到了這樣一條提交:

根據提交,我們找到了對應的 issue(https://github.com/dotnet/aspnetcore/issues/34303):

看來,要想支持 IFormFile 參數,我們得等到2022年11月(.NET 7 預計發布日期)!!!

解決方案

幸好,該 issue 也提供了變通的解決方案,傳入 HttpRequest 參數:

app.MapPost("/upload",async?(HttpRequest?request)?=>{var?form?=?await?request.ReadFormAsync();return?Results.Ok(form.Files.First().FileName);});

驗證成功。

結論

后面,我也嘗試過在 .NET 6 中用以前的 Controller 方式實現,完全沒問題。

看來最小 WEB API 是不同的實現機制,不確定還有不有其他的坑。

建議:最小 WEB API 暫時不要用于生產項目。

總結

以上是生活随笔為你收集整理的想说爱你不容易 | 使用最小 WEB API 实现文件上传的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。