2013-02-24 104 views
2

编辑:整个问题竟然是一个网络问题,但如果你看到我怎么能优化过程中,我想任何想法仍然很感激。发送BLOB到Servlet通过Ajax

我是相当新的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); 
} 

它运作良好,因为斑点到达那里我用这段代码来处理它了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上传),它没有任何问题,在处理它所有,花了不到一秒钟。服务器驻留在我的本地主机上,所以我认为网络根本不会落后于我。

如果任何人有过这个问题,我会为任何指针感激。

回答

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。

还有,你是怎么“计算”的速度?

+0

非常感谢您的回复,但事实证明,这毕竟是一个网络问题 - 我重新启动了调制解调器,这一切都很好。我会尽量使用你的提示,以提高效率。我计算速度的方式是在请求开始和结束时的时间戳,我基本上将文件大小除以了秒数。 – STT 2013-02-24 21:29:18