当前位置: 首页 > 面试题库 >

通过Ajax将Blob发送到Servlet

何浩荡
2023-03-14
问题内容

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

我对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上传的文件),并且处理该文件没有问题,花费更少一秒钟。该服务器位于我的本地主机上,因此我认为网络根本不会让我落后太多。

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


问题答案:

一些想法:

增加缓冲区大小:也许:

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。

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



 类似资料:
  • 所以我试图通过ajax将图像作为一个blob发送。blob的类型正确,大小约为4.5 kb。我试着这样发送: 接收页面看起来像这样: 它告诉我找不到索引“图像”。所以不仅数据没有发送,甚至索引也被省略了。我做错了什么? 编辑: toBlob和toDataURL都不会产生任何东西,只是一个空的PNG。有没有办法将数据从帧缓冲区转换成Base64编码的jpg或png?

  • 问题内容: 我正在通过失败学习Ajax并碰壁: 我有一个用Javascript编写的数组(如果有关系,该数组将根据用户选中的复选框存储数字ID)。 我有一个函数,当用户单击“保存”按钮时被调用。功能如下: 我的问题是: 我可以在此函数中添加什么以将数组拉入要调用的php脚本(“ create_amenities.php”)? 此外,我应该尝试使用JSON吗?如果是这样,我如何通过ajax发送JSO

  • 问题内容: 我想发送一个用JavaScript构造的数组,其中包含多个select的选定值。有没有一种方法可以使用ajax将此数组发送到php脚本? 问题答案: 您可以使用XML或JSON发回到服务器。您的javascript将必须构造该帖子,在XML的情况下,则需要您在javascript中创建它。JSON不仅轻巧,而且更易于在javascript中制作。签出JSON- PHP 来解析JSON。

  • 问题内容: 我正在使用ajax提交包含数组,文本字段和文件的多部分表单。 我将每个VAR附加到主数据中 然后我使用ajax函数将其发送到PHP文件以存储在sql DB中。 但是在PHP方面,变量(即数组)显示为字符串。 当我不使用ajax作为表单数据发送它,而是使用简单的选项时,确实在PHP端将它作为数组获得,但是后来我也无法发送文件。 有什么办法吗? 问题答案: 您有几种选择: 将其转换为JSO

  • 我正在使用ajax提交一个包含数组、文本字段和文件的多部分表单。 我将每个VAR附加到主数据中,如下所示 然后使用ajax函数将其发送到PHP文件中存储在sql DB中。 但是在PHP端,变量(一个数组)显示为字符串。 当我没有将它作为表单数据与ajax一起发送,而是使用简单的选项时,我会在PHP端将它作为一个数组来获取,但这样我就不能同时发送文件。 有什么解决办法吗?

  • 问题内容: 我有一个内置的javascript,它可以执行以下操作:通过ajax-> php-> sql获取内容,并在单击内容后在index.php上显示它,将显示新内容。 现在,我想拥有一个在将内容单击到php之后发送数据的函数,该函数将在db中执行某些操作。如何创建将发送数据的功能?谢谢! 这是我的显示内容的代码: }); }` 问题答案: 您可以通过在jQuery.ajax 设置中包含值,将