Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MultipartFormDataStreamProvider并附加到现有文件_C#_Asp.net_Asp.net Mvc_Cordova_Asp.net Web Api - Fatal编程技术网

C# MultipartFormDataStreamProvider并附加到现有文件

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

嘿,斯塔克斯

我使用ASP.net WebApi从Cordova应用程序(通过HTTP多部分POST请求发送)接收上载。上传是“分块”的,因此,我需要在第一个分块上创建一个文件,然后将每个后续的“分块”附加到它。以下是我目前的工作内容:

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字节的视频文件,这是我假设上传的最后一个“块”。这有帮助吗?感谢链接…我相信这是分块传输编码,在这种情况下,您不需要自定义多部分流提供程序,您应该能够直接使用默认的流提供程序…好的,所以扔掉我的自定义提供程序(目前仅用于写入自定义文件名)。。。我仍然不知道如何创建然后附加“块”对于该文件…根据我的理解,分块传输编码是一个较低级别的详细信息,在应用程序层,您可以不考虑较低级别的详细信息而继续读取字节流…在这种情况下,您可以使用默认的多部分表单数据流提供程序,它负责读取字节流并创建文件在提供的根文件夹中。。