Я попытался решить эту проблему и обнаружил следующие вещи, которые, надеюсь, пригодятся вам:
1) Функция JS, которую вы используете для нарезки файла, устарела.Я использую Chrome v14, и консоль не распознала его.Мне пришлось изменить это до того, как я смог что-либо сделать:
var chunk = blob.webkitSlice(start, end);
2) Я экспериментировал с гораздо меньшими файлами (около 10 МБ), но у меня были похожие проблемы - мое видео всегда было повреждено после загрузки.Когда я сравнил оригинал и «копию», я заметил одну особенность: казалось, что части файла просто перепутались - все было там, но в неправильном порядке.
Подозреваю, одна проблема у вастекущая программа страдает от того, что не предпринимает мер, чтобы убедиться, что файлы собраны в правильном порядке.Я полагаю, что происходит то, что ваш JS запускает uploadFile несколько раз, не дожидаясь завершения предыдущих загрузок, и сервер пытается собрать файлы в порядке их получения, но это не тот порядок, в котором файлы отправляются..
Я смог доказать это, заставив ваш код работать (несколько измененный, взломанный вместе в качестве подтверждения концепции), присвоив каждому файлу порядковый номер, как он был получен, а затем после всех частей.были получены сборка их по порядку.После этого я смог воспроизвести мой видеофайл после загрузки.
Я думаю, вам придется предпринять аналогичные меры.Получите все куски файлов, а затем соберите их или, по крайней мере, убедитесь, что вы принимаете необходимые меры для их сборки по порядку.Я не уверен, почему ваши файлы будут увеличиваться в размере (я уже наблюдал это явление на ранней стадии), поэтому я подозреваю, что это просто какой-то странный побочный эффект от несинхронизации фрагментов файла.
Одна трудность, с которой вы сразу столкнетесь, состоит в том, что объект Blob в Javasacript не поддерживает изменение или установку имени файла, поэтому вы не можете на стороне клиента дать файлу уникальный идентификатор таким образом.В качестве простого обходного пути я сделал следующее:
var i = 1;
while( start < SIZE ) {
var chunk = blob.webkitSlice(start, end);
uploadFile(chunk, i);
i++;
start = end;
end = start + BYTES_PER_CHUNK;
}
function uploadFile(blobFile, part) {
....
xhr.open("POST", "test.php?num=" + part);
....
}
Как вы, вероятно, можете догадаться на стороне сервера, я просто использую эту переменную GET для присвоения идентификатора и использую ее какоснова для любой другой обработки, которая должна быть выполнена на сервере.
В любом случае, это напрямую не решает проблему увеличения размера файла, поэтому я могу только надеяться, что это поможет вам;Мне любопытно посмотреть, что еще ты узнаешь!