C# 如何实现一个WebAPI控制器来接受使用JQuery文件上传的分块上传?

C# 如何实现一个WebAPI控制器来接受使用JQuery文件上传的分块上传?,c#,asp.net-web-api,jquery-file-upload,C#,Asp.net Web Api,Jquery File Upload,正如标题所述,我需要一些帮助来实现一个WebAPI控制器,以便使用JQuery文件上传来接受分块上传。任何帮助(包括现有文章/教程的链接)都将不胜感激。您可以在此处找到灵感:。分块上传控制器方法的示例从UploadFile开始。在客户端,jquery文件上传选项maxChunkSize需要根据设置。首先让我们从客户端开始。 必须为分块上载设置maxChunkSize选项。之后,您需要每个文件都有一个唯一的标识符,以便标识服务器上的每个区块,并将相应的区块数据附加到正确的文件中 $('#fileu

正如标题所述,我需要一些帮助来实现一个WebAPI控制器,以便使用JQuery文件上传来接受分块上传。任何帮助(包括现有文章/教程的链接)都将不胜感激。

您可以在此处找到灵感:。分块上传控制器方法的示例从
UploadFile
开始。在客户端,jquery文件上传选项
maxChunkSize
需要根据设置。

首先让我们从客户端开始。 必须为分块上载设置maxChunkSize选项。之后,您需要每个文件都有一个唯一的标识符,以便标识服务器上的每个区块,并将相应的区块数据附加到正确的文件中

$('#fileupload')
        .bind('fileuploadsubmit', function (e, data) {
            data.headers = $.extend(data.headers,
                {"X-File-Identifier": generateFileUniqueIdentifier(data)})
            });
        });

generateFileUniqueIdentifier = function(data){
    var file=data.files[0],
    var result = file.relativePath||file.webkitRelativePath||file.fileName||file.name;

    return result.replace(/[^0-9a-zA-Z_-]/img,"") + "-" + i.size + "-" + $.now()
} 
现在在服务器端:ApiController

 public class UploadController : ApiController
 {
        [HttpPost]
        [Route("upload/{targetFolder:int}")]
        [ValidateMimeMultipartContentFilter]
        public async Task<IHttpActionResult> UploadDocument(int targetFolder)
        {
            var uploadFileService = new UploadFileService();
            UploadProcessingResult uploadResult = await uploadFileService.HandleRequest(Request);

            if (uploadResult.IsComplete)
            {
                // do other stuff here after file upload complete    
                return Ok();
            }

            return Ok(HttpStatusCode.Continue);

        }
}
最后是服务响应模型和区块元数据

public class FileChunkMetaData
{
    public string ChunkIdentifier { get; set; }

    public long? ChunkStart { get; set; }

    public long? ChunkEnd { get; set; }

    public long? TotalLength { get; set; }

    public bool IsLastChunk
    {
        get { return ChunkEnd + 1 >= TotalLength; }
    }
}

public class UploadProcessingResult
{
    public bool IsComplete { get; set; }

    public string FileName { get; set; }

    public string LocalFilePath { get; set; }

    public NameValueCollection FileMetadata { get; set; }
}

由于还没有评论,我已经用jQuery FileUpload和asp.net web api成功地实现了这个方法,谢谢!需要考虑云环境,其中请求不由同一服务器处理。需要一种方法不仅同步文件ID,而且同步可能分散的服务器场中的缓存。ValidateMemMultipartContentFilter我们从何处获得此信息?
public static class HttpRequestMessageExtensions
{
        public static bool IsChunkUpload(this HttpRequestMessage request)
        {
            return request.Content.Headers.ContentRange != null;
        }

        public static FileChunkMetaData GetChunkMetaData(this HttpRequestMessage request)
        {
            return new FileChunkMetaData()
            {
                ChunkIdentifier = request.Headers.Contains("X-DS-Identifier") ? request.Headers.GetValues("X-File-Identifier").FirstOrDefault() : null,
                ChunkStart = request.Content.Headers.ContentRange.From,
                ChunkEnd = request.Content.Headers.ContentRange.To,
                TotalLength = request.Content.Headers.ContentRange.Length
            };
        }
    }
public class FileChunkMetaData
{
    public string ChunkIdentifier { get; set; }

    public long? ChunkStart { get; set; }

    public long? ChunkEnd { get; set; }

    public long? TotalLength { get; set; }

    public bool IsLastChunk
    {
        get { return ChunkEnd + 1 >= TotalLength; }
    }
}

public class UploadProcessingResult
{
    public bool IsComplete { get; set; }

    public string FileName { get; set; }

    public string LocalFilePath { get; set; }

    public NameValueCollection FileMetadata { get; set; }
}