Fineuploader Chunking - может загрузить несколько, но потом не получается

Я использую FineUploader для многих версий, и мне ОЧЕНЬ нравится то, что вы, ребята, сделали. Это касается v5.3.0 с использованием оболочки jquery.

Проект, над которым я сейчас работаю, должен разбивать файлы на части (некоторые из них имеют размер до 2 ГБ), и я вроде как разбил на части файлы. Я могу загрузить несколько кусков, и это все.

Созданный мной процесс создания фрагментов создает папку на основе qqUUID и сбрасывает фрагменты в эту папку. Части именуются только по их qqpartindex (0, 1, 2 и т. д.), поэтому их можно заказать позже и перестроить. На данный момент я еще не зашел так далеко, поэтому, пожалуйста, поправьте меня, если это неправильно. Я могу сохранить только 3 файла, прежде чем получаю сообщение об ошибке (для тестового файла размером 20 МБ). Я получаю эту ошибку: «XHR вернул код ответа 0», хотя я не выполняю межсайтовые сценарии (локально работающее приложение с правильными разрешениями на сохранение сетевых ресурсов), и я ВСЕГДА могу сохранить 3 файла и все. Странно, что я могу заставить некоторых работать, но это все. Что мне не хватает? Спасибо за вашу помощь!

См. код Fineuploader на стороне клиента ниже, который работает:

<script type="text/javascript">
var filesToUpload = 0;
var uploadedFileCounter = 0;
var po = '@Model.PurchaseOrder';
var companyNumber = '@Model.CompanyNumber';

$().ready(function () {
    var fineuploader = $('#files-upload').fineUploader({
        debug: false,
        template: 'qq-template',
        button: $("#uploadButton"),
        request:
        {
            endpoint: '@Url.Action("UploadFile", "Upload")',
            forceMultipart: true,
            customHeaders: { Accept: 'application/json' },
            params: {
                po: (function () { return po; }),
                companyNumber: (function () { return companyNumber; }),
            }
        },
        validation: {
            acceptFiles: ['image/*', +                   
                'audio/mp4a-latm'],
            allowedExtensions: ['jpeg', 'jpg', 'gif', 'png', 'bmp', 'm4a'],
            sizeLimit: 1024 * 1024 * 1024 * 2, // 2 GB
            stopOnFirstInvalidFile: false
        },
        chunking: {
            enabled: true,
            concurrent: {
                enabled: true
            },
            mandatory: true,
            success: {
                endpoint: '@Url.Action("UploadChunksComplete", "Upload")'
            }
            //, expected: false  // allow cross-domain requests
        },
        failedUploadTextDisplay: {
            mode: 'custom'
        },
        multiple: true
    }).on('submitted', function (event, id, filename) {                        
        filesToUpload++;
        $(':input[type=button], :input[type=submit], :input[type=reset]').attr('disabled', 'disabled');            
    }).on('complete', function (event, id, filename, responseJSON) {
        uploadedFileCounter++;
        if (filesToUpload == uploadedFileCounter) {
            $(':input[type=button], :input[type=submit], :input[type=reset]').removeAttr('disabled');
                        }
    }).on('error', function (event, id, name, errorReason, xhr) {
        alert('error: ' + errorReason);            
    });
});

The server side code for chunks looks like this, which 'works' and I can step into it:

 [HttpPost]
    public HttpResponseMessage UploadFile(HttpPostedFileWrapper qqfile, string po, string companyNumber)
    {            
        var id = Request["qquuid"];
        var filename = (Request["qqpartindex"]); 

        var x = FileProcessor.Storage.SaveChunk(qqfile, id, filename, Config.Instance.TemporaryChunkDirectory);

        var response = new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
        return response; 
    }     

Метод SaveChunk, являющийся частью отдельного проекта, показан ниже:

 public static bool SaveChunk(HttpPostedFileWrapper file, string id, string filename, string fileTemporarySavePath)
    {
        if (!VerifyFile(file)) { return false; }

        if (filename == null) { filename = "0"; } // creating index 0 for files that don't actually need chunk

        Common.CreateTempDirectory(fileTemporarySavePath, id);            

        try
        {
            var pathfilename = string.Join("\\", fileTemporarySavePath, id, filename);
            file.SaveAs(pathfilename);

            return true;
        }
        catch (Exception ex)
        {
            var error = ex.Message.ToString();
            return false;
        }
    }

person RichieMN    schedule 14.09.2015    source источник
comment
Вы недавно включали опцию chunking.concurrent? С выключенным все нормально работает?   -  person Ray Nicholus    schedule 14.09.2015
comment
Он не работает независимо от того, включен он или нет. Консоль в настоящее время показывает это: [Fine Uploader 5.3.0] Ошибка при попытке проанализировать текст ответа xhr (неожиданный токен S) (строка 249 qq.log - window.console[level](message); )   -  person RichieMN    schedule 14.09.2015


Ответы (2)


Мне нужно было добавить

{"success":true}

в тело запроса, а не просто вернуть статус ОК в заголовке. Виноват. Переходим к следующей задаче, спасибо!

person RichieMN    schedule 14.09.2015
comment
Хм, я не уверен, как это приведет к сообщению журнала, опубликованному в вашем вопросе. - person Ray Nicholus; 15.09.2015

Код ответа 0 обычно указывает на некоторую проблему в сети между клиентом и сервером. В частности, это может быть признаком того, что был получен совершенно пустой ответ (без заголовков или полезной нагрузки). Это может произойти, если сетевое соединение между клиентом и сервером прервано или если сервер в каком-то месте дает сбой и возвращает пустой ответ из-за непроверенной ошибки.

person Ray Nicholus    schedule 14.09.2015
comment
Помимо 200, отправляемых обратно в ответ для каждого фрагмента, я что-то еще упустил? - person RichieMN; 14.09.2015
comment
Если браузер сообщает статус 0, то 200 не возвращается, или, по крайней мере, этот ответ не доходит до браузера. - person Ray Nicholus; 14.09.2015