Качване и обработка на файлове в ASP MVC

Трябва да внедря следващата страница:

Потребителят щраква върху бутона Качване на файл, избира файл и го качва на сървъра. След качването файлът ще бъде обработен от конвертор. Конверторът може да върне процент от преобразуването. Как да внедря непрекъсната лента за напредък на страницата (напредък = напредък на качване + напредък на конвертиране)?

Използвам PlUpload - този инструмент може да върне процент от качения файл на сървъра, но не мога да отменя върнатия процент.

Това моето действие за качване:

   public ActionResult ConferenceAttachment(int? chunk, string name, Identity cid)
    {
        var fileUpload = Request.Files[0];

        var tempfolder = Path.GetTempFileName().Replace('.', '-');
        Directory.CreateDirectory(tempfolder);
        var fn = Path.Combine(tempfolder, name);

        chunk = chunk ?? 0;
        using (var fs = new FileStream(fn, chunk == 0 ? FileMode.Create : FileMode.Append))
        {
            var buffer = new byte[fileUpload.InputStream.Length];
            fileUpload.InputStream.Read(buffer, 0, buffer.Length);
            fs.Write(buffer, 0, buffer.Length);
        }

        // CONVERTING ....

        return Content("OK", "text/plain");
    }

Кое архитектурно решение може да реши моя проблем? Или коя библиотека за качване на JS?


person Dmitriy Kudinov    schedule 23.10.2013    source източник
comment
Наистина ли използвате функцията за разкъсване на plupload? (файл от 30mb е качен да речем в 60 парчета от 500kb?) Ако е така, кога се извършва преобразуването? При получаване на всяко парче? Ако е така, вашият код изглежда добре и просто върнете json резултат като този {jsonrpc: 2.0, резултат: null}   -  person jbl    schedule 23.10.2013
comment
Трябва да съставя единична лента за напредъка от напредъка на качването и напредъка на конвертирането. Първоначално всички качвания на файлове, след това конвертиране.   -  person Dmitriy Kudinov    schedule 23.10.2013
comment
наистина ли се нуждаете от целия файл, за да започнете преобразуването си?   -  person jbl    schedule 23.10.2013
comment
Да, както бях тъжен преди.   -  person Dmitriy Kudinov    schedule 24.10.2013


Отговори (2)


Трябва да използвате някакъв вид Real-Time връзка или Streaming, за да направите това.

1) С помощта на SignalR можете да създадете Hub за уведомяване на клиента за напредъка, лесен за изпълнение и мощен.

Научете за ASP.NET SignalR

2) Можете да адаптирате този пример за PushStreamContent, за да изпратите напредъка, докато конвертирате:

Асинхронно поточно видео с ASP.NET Web API

person Fals    schedule 23.10.2013

Можете да зададете размер на буфера колкото искате. Но бих казал да качите 8kb данни във файл наведнъж и междувременно да започнете процеса на поточно преобразуване асинхронно. Но за плавен напредък отново какъв вид файл искате да качите?

person Vishwajeet Kulkarni    schedule 23.10.2013
comment
Различни файлове (от 10kb до 30 mb). Конвертирането може да отнеме от 1 секунда до 5 минути. - person Dmitriy Kudinov; 23.10.2013
comment
Мисля, че това, което казах по-рано, може да работи правилно във вашия случай. Но може да е различно във видео и т.н. конвертиране на файлове - person Vishwajeet Kulkarni; 23.10.2013