C#学习教程:上传带有附加参数的Webapiformdata(toDB)我在stackoverflow中找到了以下帖子:Webapiajaxformdatauploadwithextraparameters它描述了如何使用MultipartFormDataStreamProvider并将数据保存到文件服务器。我不需要将文件保存到服务器,而是保存到数据库。我已经使用MultipartMemoryStreamProvider来处理代码,但它不使用额外的参数。你能告诉我如何处理webapi中的额外参数吗?例如,如果我添加一个文件和测试参数:data.append("myParameter","test");这是我的webapi,它在没有额外参数的情况下处理文件上传:if(Request.Content.IsMimeMultipartContent()){vartask=Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t=>{if(t.IsFaulted||t.IsCanceled){thrownewHttpResponseException(HttpStatusCode.InternalServer=ErrorService);数据}newFileDataBLL();FileData文件;varfleInfo=streamProvider.Contents.Select(i=>{fle=newFileData();fle.FileName=i.Headers.ContentDisposition.FileName;varcontentTest=i.ReadAsByteArrayAsync();contentTest.Wait();if(contentTest.Result!=null){fle.FileContent=contentTest.Result;}//在这里获取额外参数??????_fleDataService.Save(fle);returnnewFileModel(i.Headers.ContentDisposition.FileName,1024);//待办事项});返回fleInfo;});回归任务;您可以实现自定义DataStreamProvider以非常非常干净的方式实现了这一点,这个自定义DataStreamProvider复制了用于从MultipartFormDataStreamProvider多部分内容解析FormData的逻辑FormData集合,因为它对涉及多部分数据的许多任务很有用,只需将文件保存到磁盘。无论如何,以下提供商应该可以帮助您解决问题。您仍然需要确保在迭代提供程序内容时忽略任何没有文件名的内容(尤其是语句streamProvider.Contents.Select()否则您可能会尝试将表单数据上传到数据库)。所以询问提供者的代码是HttpContentIsStream(),这有点hack,但我能想到的最简单的做法。请注意,它基本上是来自MultipartFormDataStreamProvider源的剪切和粘贴ax作业-它尚未经过严格测试(受此答案启发)。公共类MultipartFormDataMemoryStreamProvider:MultipartMemoryStreamProvider{privatereadonlyCollection_isFormData=newCollection();privatereadonlyNameValueCollection_formData=newNameValueCollection(StringComparer.OrdinalIgnoreCase);publicNameValueCollectionFormData{get{return_formData;}}publicoverrideStreamGetStream(HttpContentparent,HttpContentHeadersheaders){if(parent==null)thrownewArgumentNullException("parent");如果(headers==null)thrownewArgumentNullException("headers");varcontentDisposition=headers.ContentDisposition;如果(contentDisposition!=null){_isFormData.Add(String.IsNullOrEmpty(contentDisposition.FileName));返回base.GetStream(parent,headers);}thrownewInvalidOperationException("在MIME多部分正文部分中未找到所需的'Content-Disposition'标头字段。");}publicoverrideasyncTaskExecutePostProcessingAsync(){for(varindex=0;index1)returntoken.Substring(1,token.Length-2);返回令牌;}publicboolIsStream(intidx){return!_isFormData[idx];它可以按如下方式使用(使用TPL语法来匹配您的问题):“无效的请求!”));varprovider=newMultipartFormDataMemoryStreamProvider();返回返回。ReadAsMultipartAsync(provider).ContinueWith(p=>{varresult=p.Result;varmyParameter=result.FormData.GetValues("myParameter").FirstOrDefault();foreach(varstreaminresult.Contents.Where((content,idx)=>result.IsStream(idx))){varfile=newFileData(stream.Headers.ContentDisposition.FileName);varcontentTest=stream.ReadAsByteArrayAsync();//...依此类推,按照你原来的代码。}返回我的参数;});我使用以下HTML表单对其进行了测试:扩展gooid的答案,我将FormData提取包装到提供程序中,因为我在引用它时遇到问题只是提供了一个更好的实现。公共类MultipartFormDataMemoryStreamProvider:MultipartMemoryStreamProvider{privatereadonlyCollection_isFormData=newCollection();privatereadonlyNameValueCollection_formData=newNameValueCollection(StringComparer.OrdinalIgnoreCase);privatereadonlyDictionary_fileStreams=newDictionary();publicNameValueCollectionFormData{get{return_formData;}}publicDictionaryFileStreams{get{return_fileStreams;}}publicoverrideStreamGetStream(HttpContentparent,HttpContentHeadersheaders){if(parent==null){thrownewArgumentNullException("parent");}if(headers==null){thrownewArgumentNullException("headers");}varcontentDisposition=headers.ContentDisposition;if(contentDisposition==null){thrownewInvalidOperationException("在MIME多部分正文部分中未找到所需的'Content-Disposition'标头字段。");}_isFormData.Add(String.IsNullOrEmpty(contentDisposition.FileName));回归基地etStream(父母,标题);}publicoverrideasyncTaskExecutePostProcessingAsync(){for(varindex=0;index1){returntoken.Substring(1,token.Length-2);}返回令牌;这是我如何使用它请注意,我正在使用await,因为我们使用的是.NET4.5。[HttpPost]publicasyncTaskUpload(){if(!Request.Content.IsMimeMultipartContent()){returnRequest.CreateResponse(HttpStatusCode.UnsupportedMediaType,"不支持的媒体类型。");}//读取文件和表单数据。MultipartFormDataMemoryStreamProviderprovider=newMultipartFormDataMemoryStreamProvider();等待Request.Content.ReadAsMultipartAsync(provider);//从表单数据中提取字段。字符串描述=provider.FormData["描述"];int上传类型;if(!Int32.TryParse(provider.FormData["uploadType"],outuploadType)){returnRequest.CreateResponse(HttpStatusCode.BadRequest,"上传类型无效。");}//检查文件是否在请求中。if(!provider.FileStreams.Any()){returnRequest.CreateResponse(HttpStatusCode.BadRequest,"没有文件上传。");}IListuploadedFiles=newList();foreach(provider.FileStreams中的KeyValuePair文件){stringfileName=file.Key;流stream=file.Value;//做点什么上传的文件UploadManager.Upload(stream,fileName,uploadType,description);//跟踪响应的文件名uploadedFiles.Add(fileName);}returnRequest.CreateResponse(HttpStatusCode.OK,"成功上传:"+string.Join(",",uploadedFiles));我确实需要上传文件的媒体类型和长度,所以我修改了@MarkSeefeldt的回答如下:publicclassMultipartFormFile{publicstringName{get;放;}公共长?长度{得到;放;}publicstringMediaType{得到;放;}publicStreamStream{get;新的NameValueCollection(StringComparer.OrdinalIgnoreCase);私有只读列表_fileStreams=newList();publicNameValueCollectionFormData{get{return_formData;}}publicListFileStreams{get{return_fileStreams;}}公共覆盖StreamGetStream(HttpContentparent,HttpContentHeadersheaders){if(parent==null){thrownewArgumentNullException("parent");}}if(headers==null){thrownewArgumentNullException("headers");}varcontentDisposition=headers.ContentDisposition;if(contentDisposition==null){thrownewInvalidOperationException("在MIME多部分正文部分中未找到所需的'Content-Disposition'标头字段。");}_isFormData.Add(String.IsNullOrEmpty(contentDisposition.FileName));返回基础.GetStream(parent,headers);}publicoverrideasyncTaskExecutePostProcessingAsync(){for(varindex=0;index1){returntoken.Substring(1,token.Length-2);}返回令牌;最后,下面是对我有用的:以上是C#学习教程:使用附加参数上传Webapiformdata共享的所有内容(到DB)。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——stringroot=HttpContext.Current.Server.MapPath("~/App_Data");varprovider=newMultipartFormDataStreamProvider(root);varfilesReadToProvider=awaitRequest.Content.ReadAsMultipartAsync(pr提供者);foreach(varfileinprovider.FileData){varfileName=file.Headers.ContentDisposition.FileName.Replace(""",string.Empty);byte[]documentData;documentData=File.ReadAllBytes(file.LocalFileName);DAL。文档newRecord=newDAL.Document{PathologyRequestId=PathologyRequestId,FileName=fileName,DocumentData=documentData,CreatedById=ApplicationSecurityDirector.CurrentUserGuid,CreatedDate=DateTime.Now,UpdatedById=ApplicationSecurityDirector.CurrentUserGuid.Documents.Add(newRecord);context.SaveChanges();}本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处: