Java 通过ajax向servlet发送blob

Java 通过ajax向servlet发送blob,java,ajax,jakarta-ee,servlets,xmlhttprequest,Java,Ajax,Jakarta Ee,Servlets,Xmlhttprequest,编辑:整个问题原来是一个网络问题,但如果你看到我如何优化流程的任何想法,我仍然会很感激 我对Servlets是一个相当陌生的人,在我的旅程不远的时候,我遇到了一个问题,一个与性能有关的问题。我正试图通过谷歌浏览器中的XHR对象发送视频文件。视频文件存储在Blob对象中。我在JavaScript脚本中使用此函数: function upload(blob) { var xhr = new XMLHttpRequest(); xhr.open('POST', '/Test/Odbieracz

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

我对Servlets是一个相当陌生的人,在我的旅程不远的时候,我遇到了一个问题,一个与性能有关的问题。我正试图通过谷歌浏览器中的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,我在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上传的同一个文件),它在处理这个文件时完全没有问题,只花了不到一秒钟的时间。服务器位于我的本地主机上,所以我认为网络根本没有给我太多的延迟

如果以前有人遇到过这个问题,我将非常感谢您的指点。

一些想法:

增加缓冲区大小:可能:

byte[] buffer = new byte[1024 * 1024];
不要经常写入输出文件。当缓冲区的其余部分等待时,Java必须执行昂贵的I/O操作。折衷的办法是,如果处理的是小文件,就会浪费一点内存

使用
缓冲输出流
: 原因同上。强烈建议在写入非常大的文件时使用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


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

非常感谢您的回复,但这毕竟是一个网络问题-我重新启动了调制解调器,一切正常。不过我会用你的建议来提高效率。我计算速度的方法是在请求的开始和结束时使用时间戳,我基本上将文件大小除以经过的秒数。