ASP.NETWebapi接收multipartform-data文件,解析Multipa。。。

ASP.NETWebapi接收multipartform-data文件,解析Multipa。。。

2023年7月14日发(作者:)

api接收multipartform-data⽂件,解析Multipa。。。Web api 中,接收multipart/form-data⽂件,我们可以使⽤MultipartFormDataStreamProvider来保存图⽚ [HttpPost,Route("api/Job/newJob")] public async Task PostNewJob() { string root = h("~/img/workImg");//指定要将⽂件存⼊的服务器物理位置 //继承MultipartFormDataStreamProvider类 var provider =new MultipartFormDataStreamProvider(root); try { //执⾏完这条之后,⽂件便保存了 await MultipartAsync(provider); } catch (IOException innException) { //下⾯可以不⽤看,主要是上⾯的代码 //检测是否是MyMultipartFormDataStream的 GetLocalFileName⽅法发⽣异常 if (xception == null) { return Json(new { code = "500", Message = "⽂件写⼊错误" }); } return Json(new { code = "500", Message = e

} }这⾥我们可以看到,使⽤MultipartFormDataStreamProvider默认保存的⽂件名的格式是BodyPart加上⼀串数字字母组合⽽成,如果我们想要⾃定义⽂件名的话,我们可以继承MultipartFormDataStreamProvider类并重写GetLocalFileName⽅法 public class MyMultipartFormDataStreamProvider:MultipartFormDataStreamProvider { public MyMultipartFormDataStreamProvider(string path) : base(path) { }

public override string GetLocalFileName(HttpContentHeaders headers) { //这⾥获取上传的⽂件名 string Name = e(""", );

//这⾥做了⼀个判断,只有jpg,png,gif为后缀的,才给保存,否则抛出⼀个错误(写这个判断的原因是因为需求原因) if (th(".jpg", tCultureIgnoreCase) ||

th(".png", tCultureIgnoreCase) || th(".gif", tCultureIgnoreCase)) { //以ContentDisposition的哈希值加上传的名字作为⽂件名 return $"{hCode()}_{Name}"; } throw new InvalidOperationException("上传格式错误"); } }这⾥我们可以看到⽂件的⽂件名被改写成我们想要的名字了,到这⾥,出现两个疑问。1.为什么重写GetLocalFileName⽅法就可以重写⽂件名呢?2.⽂件是怎么保存的呢?我们先来讲解第⼆个问题,因为第⼆个问题讲解完了 第⼀个问题就知道答案了⽂件是怎么保存的呢?await MultipartAsync(provider);⽂件能够⾃动保存的秘密就在这个ReadAsMultipartAsync这个⽅法⾥⾯,下⾯我们来看看它的源代码是怎么样的。1.⾸先ReadAsMultipartAsync中获取了请求中的流,然后存储在MultipartAsyncContext⾥⾯,然后把MultipartAsyncContext作为参数调⽤了MultipartReadAsync⽅法。2.在MultipartReadAsync⽅法中,这⾥我也不知道这个⽅法做了什么,但是我们看到了WriteSegment⽅法,看起来⽐较可疑,看看这个⽅法是什么来的。3.在WriteSegment⽅法中,我们发现调⽤了GetOutputStream()⽅法 ,细⼼的⼩伙伴可能会发现,GetOutputStream调⽤了MultipartFormDataStreamProvider的GetStream⽅法eam⽅法中,我们可以通过源代码发现,这个⽅法的⽬的是为了获取被创造的⽂件的流,⽽想要流,就要有⽂件的路径,这⾥它调⽤了GetLocalFileName⽅法,这⾥就解答了为什么重写GetLocalFileName⽅法会改写⽂件名。WriteSegment⽅法获取了⽂件的流之后,使⽤WriteAsync⽅法向流⾥⾯写东西进去,写⼊的东西我猜是上传⽂件的数据。下⾯我们来简单回答下我们提出的两个问题:2.⽂件是怎么保存的呢?调⽤ReadAsMultipartAsync的过程中,它⾸先根据⽂件路径 (MultipartFormDataStreamProvider提供) 创造⼀个⽂件并获取这个⽂件的流,然后在把数据写进流⾥⾯保存,这样,⼀个⽂件就保存完成了。1.为什么重写GetLocalFileName⽅法就可以重写⽂件名呢?因为在保存⽂件的过程中需要获取⽂件的流,⽽获取⽂件的流需要⽂件的路径,⽂件的路径是由MultipartFormDataStreamProvider的GetStream和GetLocalFileName到这⾥,⽂件的保存过程就讲完了,以上是我的观点,如果有什么说错的地⽅,别喷O(∩_∩)O,欢迎留⾔。

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689307319a228389.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信