java - 通过 ajax 将 blob 发送到 servlet

标签 java ajax jakarta-ee servlets xmlhttprequest

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

我对 Servlet 相当陌生,在我的旅程中不久,我遇到了一个问题,一个与性能相关的问题。我正在尝试通过 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 上传的文件相同),并且处理它时完全没有问题,花费了不到一秒钟的时间。服务器驻留在我的本地主机上,所以我认为网络根本没有落后太多。

如果有人以前遇到过这个问题,我将不胜感激。

最佳答案

一些想法:

增加缓冲区大小:也许:

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。

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

关于java - 通过 ajax 将 blob 发送到 servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15056686/

相关文章:

javascript - 实时更新有问题

java - Jersey 资源类的托管 Bean

java - 服务器创建的实例什么时候死?

java - 迭代 Opencv 帧造成的内存泄漏

php header 正在工作但有错误

java - 关于lunarlander例子的简单问题

ruby-on-rails - 如何更新 ruby​​ on Rails 中的部分 View

java - Tomcat部署2个项目

java - 在 CNI/C++ 代码中实例化模板类

java - 独立java应用程序的缓存/映射策略