private FileDescriptor UploadPartialFile(HttpContext context, string uid, string fileName, int chunk, int totalChunks)
{
var fileKey = context.Request.Files.Keys[0];
var httpFile = context.Request.Files[fileKey];
var partialFileName = "_" + uid + "_" + fileName;
var chunkPrefix = "C" + chunk;
FileDescriptor descriptor = new FileDescriptor(fileKey, PartialPath, chunkPrefix + partialFileName, httpFile.ContentLength);
using (var fs = new FileStream(descriptor.FilePath, FileMode.Append, FileAccess.Write))
{
var buffer = new byte[1024];
var l = httpFile.InputStream.Read(buffer, 0, 1024);
while (l > 0)
{
fs.Write(buffer, 0, l);
l = httpFile.InputStream.Read(buffer, 0, 1024);
}
fs.Flush();
fs.Close();
}
DirectoryInfo d = new DirectoryInfo(PartialPath);
var files = d.EnumerateFiles("*" + partialFileName).OrderBy(f => Convert.ToInt32(f.Name.Split('_')[0].Replace("C", "")));
var size = files.Sum(f => f.Length);
bool allChunksReceived = file.Count() == totalChunks;
if (!allChunksReceived)
{
return descriptor;
}
else
{
descriptor = new FileDescriptor(fileKey, BasePath, fileName, size);
RaiseBeforeFileUpload(descriptor, true);
using (var fs = new FileStream(descriptor.FilePath, FileMode.Append, FileAccess.Write))
{
foreach (var file in files)
{
using (var pfs = file.OpenRead())
{
var buffer = new byte[1024];
var l = pfs.Read(buffer, 0, 1024);
while (l > 0)
{
fs.Write(buffer, 0, l);
l = pfs.Read(buffer, 0, 1024);
}
pfs.Close();
}
file.Delete();
}
fs.Flush();
fs.Close();
}
RaiseAfterFileUpload(descriptor, true);
return descriptor;
}
}