gpt4 book ai didi

java - Servlet 从服务器加载视频文件

转载 作者:行者123 更新时间:2023-11-30 05:05:22 25 4
gpt4 key购买 nike

我有一个 servlet,它从服务器加载视频文件并将其作为对 http get 请求的响应发送。这是他的代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
System.out.println("Start of doGet");

FileSystemManager fsManager = null;
try {
fsManager = VFS.getManager();
} catch (FileSystemException e) {

e.printStackTrace();
}


// Get requested image by path info.
String requestedImage = request.getPathInfo();

// Check if file name is actually supplied to the request URI.
if (requestedImage == null) {
// Do your thing if the image is not supplied to the request URI.
// Throw an exception, or send 404, or show default/warning image, or just ignore it.
response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
return;
}

FileObject basePath;

try {

basePath = fsManager.resolveFile( imagePath + URLDecoder.decode(requestedImage, "UTF-8"));


} catch (FileSystemException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();

return;
}
String baseName = basePath.getName().getBaseName();
String contentType = getServletContext().getMimeType(baseName);
// Init servlet response.
response.reset();
response.setBufferSize(DEFAULT_BUFFER_SIZE);
response.setContentType(contentType);
response.setHeader("Content-Length", String.valueOf(basePath.getContent().getSize()));


// Prepare streams.
BufferedInputStream input = null;
BufferedOutputStream output = null;

int count = 0;
try {
// Open streams.
FileContent fc = basePath.getContent();
InputStream is = (InputStream) fc.getInputStream();
input = new BufferedInputStream(is, DEFAULT_BUFFER_SIZE);
output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

// Write file contents to response.
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
count++;
}
System.out.println("no exception occurred");

}
catch(Exception e){
System.out.println("while did " + count + " iterations befor exception occurred");
System.out.println("Catched exception: " + e);
}
finally{
// Gently close streams.
System.out.println("closing streams");
close(input);
close(output);

}
}

例如,当我在 google chrome 中启动时 http://localhost:8080/MyApp/video/VX-276.ogg我得到这个输出:

doGet 开始

在发生异常之前进行了 3 次迭代

捕获异常:ClientAbortException:java.net.SocketException:对等方重置连接:套接字写入错误

关闭流

doGet 开始

在发生异常之前进行了 4 次迭代

捕获异常:ClientAbortException:java.net.SocketException:软件导致连接中止:套接字写入错误

关闭流

doGet 开始

doGet 开始

在发生异常之前进行了 224 次迭代

捕获异常:ClientAbortException:java.net.SocketException:对等方重置连接:套接字写入错误

关闭流

在发生异常之前进行了 4 次迭代

捕获异常:ClientAbortException:java.net.SocketException:软件导致连接中止:套接字写入错误

关闭流

doGet 开始

在发生异常之前进行了 12 次迭代

捕获异常:ClientAbortException:java.net.SocketException:软件导致连接中止:套接字写入错误

关闭流

如何修复我的代码?

最佳答案

ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error

网络浏览器已中止连接。可能是因为最终用户按下了 esc,或停止了视频,或导航到其他页面,或关闭了网络浏览器。或者毕竟是网络浏览器本身出于某种原因决定这样做。

您无法从服务器端对此采取任何措施。无论如何我不会记录它们。

为了最大限度地减少网络带宽的浪费,我强烈建议添加对字节范围请求的支持(阅读:下载恢复)。你可以找到一个基本的例子here 。您也可以将整个工作委托(delegate)给 servletcontainer 的内置默认 servlet,它应该已经支持这一点。您可以通过将包含视频的文件夹映射为另一个 Web 应用程序上下文来实现此目的。另请参阅this answer .

关于java - Servlet 从服务器加载视频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5290200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com