C# MultipartFormDataStreamProvider并附加到现有文件
嘿,斯塔克斯 我使用ASP.net WebApi从Cordova应用程序(通过HTTP多部分POST请求发送)接收上载。上传是“分块”的,因此,我需要在第一个分块上创建一个文件,然后将每个后续的“分块”附加到它。以下是我目前的工作内容:C# MultipartFormDataStreamProvider并附加到现有文件,c#,asp.net,asp.net-mvc,cordova,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Cordova,Asp.net Web Api,嘿,斯塔克斯 我使用ASP.net WebApi从Cordova应用程序(通过HTTP多部分POST请求发送)接收上载。上传是“分块”的,因此,我需要在第一个分块上创建一个文件,然后将每个后续的“分块”附加到它。以下是我目前的工作内容: public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider { public CustomMultipartFormDataStreamProv
public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
public CustomMultipartFormDataStreamProvider(string path) : base(path)
{ }
public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers)
{
var name = !string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName) ? headers.ContentDisposition.FileName : "NoName";
return name.Replace("\"", string.Empty); //this is here because Chrome submits files in quotation marks which get treated as part of the filename and get escaped
}
}
在控制器中
[Route("upload"), HttpGet, HttpPost]
public void HandleUpload()
{
string root = HttpContext.Current.Server.MapPath("~/App_Data/upload-temp");
if (Request.Content.IsMimeMultipartContent())
{
var streamProvider = new Libs.CustomMultipartFormDataStreamProvider(root);
var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t =>
{
if (t.IsFaulted || t.IsCanceled)
throw new HttpResponseException(HttpStatusCode.InternalServerError);
});
}
else
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted"));
}
}
我假设在CustomMultipartFormDataStreamProvider中,我会以某种方式覆盖GetStream以完成附加,但我的一生都无法理解它
有没有人对如何做到这一点有所了解
干杯:)这篇文章正是我要处理的问题,诀窍是在自定义的MultipartFormDataStreamProvider中重写GetStream方法。我的解决方案基于System.Net.Http.MultipartFormDataStreamProvider提供程序的源代码
public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) {
if (!headers.ContentDisposition.FileName.HasValue())
return Stream.Null;
if (parent == null)
throw new ArgumentNullException("parent");
if (headers == null)
throw new ArgumentNullException("headers");
var fileName = this.GetLocalFileName(headers);
if (!fileName.HasValue())
throw new ArgumentNullException("fileName");
var file = Path.Combine(this.RootPath, fileName);
this.FileData.Add(new MultipartFileData(headers, file));
// the key is appending a file as opposed to just creating it - the original ms implementation is:
// return File.Create(file, this.BufferSize, FileOptions.Asynchronous)
return new FileStream(file, FileMode.Append, FileAccess.Write, FileShare.Write, this.BufferSize, true);}
为清楚起见,这是一个多部分
表单数据请求吗?当你说分块时,你指的是他们自己的分块自定义实现,而不是分块传输编码..对吗?老实说,我不确定,但我认为是这样。是有关Cordova文件传输插件的一些文档的链接。上面的现有代码输出一个32字节的视频文件,这是我假设上传的最后一个“块”。这有帮助吗?感谢链接…我相信这是分块传输编码,在这种情况下,您不需要自定义多部分流提供程序,您应该能够直接使用默认的流提供程序…好的,所以扔掉我的自定义提供程序(目前仅用于写入自定义文件名)。。。我仍然不知道如何创建然后附加“块”对于该文件…根据我的理解,分块传输编码是一个较低级别的详细信息,在应用程序层,您可以不考虑较低级别的详细信息而继续读取字节流…在这种情况下,您可以使用默认的多部分表单数据流提供程序,它负责读取字节流并创建文件在提供的根文件夹中。。