通过ajax将blob发送到servlet

时间:2013-02-24 21:07:17

标签: java ajax java-ee servlets xmlhttprequest

编辑:整个问题原来是一个网络问题,但如果你看到我如何优化这个过程的任何想法,我仍然会很感激。

我是Servlets的新手,在我的旅途中不远处我遇到了一个与性能有关的问题。我正在尝试通过Google Chrome浏览器中的XHR对象发送视频文件。视频文件存储在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();

它也会保存文件。

我遇到的问题是它非常慢,根据我的计算,它可以处理大约42kB / s,这对于与视频文件有关的Web服务来说非常慢。我一直坐在这里几个小时试图找到一种方法来加速它,或者至少找到瓶颈,但不幸的是我不知道它可能在哪里。

我怀疑是浏览器导致延迟,我在Servlet中使用了一个不同的InputStream导致一个本地文件(我试图通过XHR上传的那个文件)并且根本没有处理它的问题,花了不到一秒钟。服务器驻留在我的本地主机上,所以我认为网络根本不会让我感到很遗憾。

如果有人之前有这个问题,我会感激任何指示。

1 个答案:

答案 0 :(得分:2)

一些想法:

增加缓冲区大小:或许:

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

不要经常写输出文件。 Java必须执行昂贵的I / O操作,而其余的缓冲区正在等待。权衡的是,如果你处理小文件,你会浪费一些内存。

使用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。

另外,你是如何“计算”速度的?