2013-02-24 3 views
2

EDIT: Вся проблема оказалась сетевой проблемой, но если вы видите какие-либо идеи о том, как я мог бы оптимизировать процесс, я бы все равно ее оценил.Отправка blob в сервлет через ajax

Я довольно новичок в сервлетах и ​​недалеко от поездки. Я столкнулся с проблемой, связанной с производительностью. Я пытаюсь отправить видеофайл через объект XHR в браузере Google Chrome. Видеофайл хранится в объекте Blob. Я использую эту функцию в моем JavaScript сценарии:

function upload(blob) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', '/Test/Odbieracz', true); 
    xhr.onload = function(e) { console.log("loaded"); }; 
    xhr.onreadystatechange = function(){ 
     console.log("state: " + xhr.readyState); 
    }; 
    // Listen to the upload progress. 
    xhr.upload.onprogress = function(e) { console.log("uploading..."); }; 
    xhr.setRequestHeader("Content-Type", "video/webm"); 
    xhr.send(blob); 
} 

Это хорошо работает, потому что Blob достигает Servlet, где я использую этот кусок кода для его обработки:

byte[] buffer = new byte[16 * 1024]; 

InputStream input = request.getInputStream();  
OutputStream output = new FileOutputStream("costam0.webm"); 
int bytesRead; 
while ((bytesRead = input.read(buffer)) != -1){ 
    System.out.println(bytesRead); 
    output.write(buffer, 0, bytesRead); 
} 
output.close(); 
input.close(); 

Это сохраняет файл, а также ,

Проблема, которая возникает у меня, заключается в том, что она очень медленная, согласно моим расчетам, она может обрабатывать около 42 кБ/с, что для веб-службы, связанной с видеофайлами, чрезвычайно медленное. Я часами сижу здесь, пытаясь найти способ ускорить его, или, по крайней мере, найти узкое место, но, к сожалению, я понятия не имею, где это может быть.

Мое подозрение, что браузер вызывает задержку, я использовал другой InputStream в своем сервлете, который ведет к локальному файлу (тот же, который я пытаюсь загрузить через XHR), и у него не было проблемы с его обработкой все, заняло меньше секунды. Сервер размещен на моем локальном хосте, поэтому я не думаю, что сеть слишком сильно меня задерживает.

Если у кого-то была эта проблема раньше, я был бы благодарен за любые указатели.

ответ

2

Некоторые идеи:

Увеличение размера буфера: Возможно:

byte[] buffer = new byte[1024 * 1024]; 

Не записывать выходной файл, как часто. Java должна выполнять дорогостоящие операции ввода-вывода, пока остальная часть буфера ожидает. Компромисс в том, что если вы имеете дело с небольшими файлами, вы потеряете немного памяти.

Использовать BufferedOutputStream: Те же причины, что и выше. Настоятельно рекомендуется использовать BufferedOutputStream при написании очень больших файлов. Вам не нужно даже беспокоиться о том, чтобы писать в течение каждого цикла. Просто вызовите buffOut.flush(), чтобы сделать одну запись после завершения цикла. Пример:

BufferedOutputStream buffOut = new BufferedOutputStream(new FileOutputStream("costam0.webm"));  
int bytesRead; 
while ((bytesRead = input.read(buffer)) != -1){ 
    System.out.println(bytesRead); 
    output.write(buffer, 0, bytesRead); 
} 
buffOUt.flush() 

Вы вычислили эти вычисления при вызове println? Не делай этого. Вы подтвердили, что процесс работает, просто медленно. Не нужно вызывать println каждый раз.

Кроме того, как вы «вычислили» скорость?

+0

Большое вам спасибо за ваш ответ, но в конце концов это оказалось проблемой для сети - я перезапустил модем, и все хорошо. Я буду использовать ваши советы, но для повышения эффективности. То, как я рассчитывал скорость, было с отметками времени в начале и в конце запросов, я в основном разделял размер файла на количество прошедших секунд. – STT

Смежные вопросы