C# 将文件上载到Web API
我有以下型号:C# 将文件上载到Web API,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我有以下型号: public class FileModel { public byte[] FileData{get;set;} public string FileName {get;set;} } 我已经编写了一个私有的Web API服务,我的Web应用程序使用它。 当用户上传文件时,我将这些文件转换成字节数组,并从C#code(不是从HTML页面,因为我的Web API是我网站的私有)向我的Web API发送一个列表,它保存我的文件并返回结果 Web API方法: [HttpP
public class FileModel
{
public byte[] FileData{get;set;}
public string FileName {get;set;}
}
我已经编写了一个私有的Web API服务,我的Web应用程序使用它。
当用户上传文件时,我将这些文件转换成字节数组,并从C#code(不是从HTML页面,因为我的Web API是我网站的私有)向我的Web API发送一个列表
,它保存我的文件并返回结果
Web API方法:
[HttpPost]
public UploadFiles(List<FileModel> files)
{
// Do work
}
[HttpPost]
公共上载文件(列表文件)
{
//工作
}
如果我上传了很多大文件,上面的代码就会中断-由于大文件的FileModel
s超过了最大序列化长度,因此代码无法序列化这些文件
如何解决此问题?有没有其他方法可以在不向用户公开的情况下将文件上载到Web API 将其添加到web.config文件中
并增加MVCconfig
文件中的内容长度
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1999999999" />
</requestFiltering>
</security>
<system.webServer>
maxRequestLength
值以KB为单位
maxAllowedContentLength
值以字节为单位
您可以根据自己的要求更改以上尺寸。这里有一些解决方案 控制器操作将不接受代码段中显示的任何参数
public async Task<HttpResponseMessage> PostByteArrayAsync()
{
string root = HttpContext.Current.Server.MapPath("~/folder");
var provider = new MultipartFormDataStreamProvider(root);
await Request.Content.ReadAsMultipartAsync(provider);
foreach (var file in provider.FileData)
{
var buffer = File.ReadAllBytes(file.LocalFileName);
// store to db and other stuff
}
return Ok();
}
可能重复使用块字节方法异步上载@NikhilKS我不想进行多个web api调用。谢谢,但maxRequestLength不是我的问题的原因。当我使用httpClient.PostAsJsonAsync(“api URL”,postObj)时。我返回一个Web API method not found的响应。但这只是针对大型文件。我认为httpClient无法将我的对象序列化为Json并发送空对象,因此我得到了Web API method not found响应。这是我的最佳猜测。my web.config内容长度:您好,谢谢您的回复,但我不会试图将文件直接发布到我的web API。我正在将文件发布到我的MVC操作控制器,并将我的控制器操作发布文件发布到我的web API。我不希望我的web API url公开,因为它是私有的(即特定于我的网站)
UploadData(event) {
this.setState({ loading: true });
event.preventDefault();
let data = new FormData();
let fileData = document.querySelector('input[type="file"]').files[0];
data.append("data", fileData);
let that = this;
fetch("api/upload", {
method: "POST",
"Content-Type": "multipart/form-data",
"Accept": "application/json",
body: data
}).then(function (res) {
if (res.ok) {
call('api', 'GET').then(response => { response.error ? response.message : that.props.change(response); that.setState({ loading: false }) });
}
else {
that.setState({ loading: false });
that.failedMsg();
}
})
}