ファイルの絶対パスと相対パスを使用して Tomcat 7 サーバーからビデオが再生されない:
要約の編集: 相対パスの例を変更し、ビデオをアプリケーションのルート フォルダー内に配置しています (まだビデオのバグを解決できません)。
ローカルで使用するためのビデオ表示用の小さなアプリケーションを構築しています。HTML-5 はビデオの表示を強力にサポートするため、単純なサーブレット/JSP を使用してプログラムを作成し、それをTomcat 7 Web サーバーにデプロイすることにしました。
アプリケーション ロジックは次のとおりです。
- ルート パス (絶対パス) は、Tomcat のアプリケーションのルート フォルダーに設定されます。
- ルート内のすべてのファイルとディレクトリが表示され、横に「移動」ボタンが表示されます。
- 「go」をクリックしてフォルダ内の動画ファイルを選択すると、動画閲覧ページが表示されます。
- 動画ファイルの関連情報は、動画タグのソースへの式言語 (EL) を使用して動画ページに提供されます。
- ビデオは、localhost のハード ディスクからすべてのブラウザー エンドポイントに再生する必要があります。
私が直面している問題は、私のビデオがTomcatサーバーから再生されていないことですが、ビデオが正常に動作しているファイルにコピーして貼り付けたときに、ブラウザで同じレンダリングされたhtmlの「ソース」コードです。tomcatサーバーから動作させるには?
編集後: Tomcat myapp のルート フォルダー内の相対パスを調整するようにアプリを変更しましたが、まだ機能していません。以下は編集された質問です。
私のアプリのスクリーンショットは次のとおりです。
ステージ 1: リンクをクリックする
ステージ 2: 参照するビデオまたはフォルダを選択します
ステージ 3: ビデオを再生します (ここでエラーが発生します)
サーバーは、ブラウザーで次の HTML をレンダリングしました (ビュー ソースからコピー):
<!doctype html>
<html>
<head>
<title>Cluster Video App</title>
<script type="text/javascript">
</script>
</head>
<body>
<h1>Enjoy the Video</h1>
<video controls autoplay width="512" height="288">
<source src="G:\\To-See\\Ravi_sir_joke.m4v"> </source>
</video>
</body>
</html>
同じソースをコピーして、コンピューターの任意の場所にあるサンプル HTML ページに貼り付けると、ビデオは正常に機能します。下の画像がそれを証明しています。
編集後:サーバーは、ビデオを含む適切な相対パスをレンダリングしました。ビデオはまだ機能していません。
<!doctype html>
<html>
<head>
<title>Cluster Video App</title>
<script type="text/javascript">
</script>
</head>
<body>
<h1>Enjoy the Video</h1>
<video controls autoplay width="512" height="288">
<source src="../ROOT-VIDEO/Ravi_sir_joke.m4v" > </source>
</video>
</body>
</html>
ビデオはアプリケーションのルート ディレクトリにあります。
編集したプログラムを参考のためにこのページに貼り付けました。私を修正し、ビデオのバグを解決するのを手伝ってください。
プログラム
パッケージ構造:
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<!-- Welcome page -->
<!-- <welcome-file-list>
<welcome-file>/welcome.do</welcome-file>
</welcome-file-list> -->
<!-- JSF mapping -->
<servlet>
<servlet-name>Controller</servlet-name>
<servlet-class>com.cluster.vapp.controller.ControllerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map these files with JSF -->
<servlet-mapping>
<servlet-name>Controller</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
コントローラ サーブレット:
package com.cluster.vapp.controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.cluster.vapp.fileutils.FileUtil;
import com.cluster.vapp.fileutils.SearchResult;
import com.cluster.vapp.service.VappService;
import com.cluster.vapp.service.VappServiceImpl;
public class ControllerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private VappService service;
public void init() throws ServletException {
service = new VappServiceImpl();
}
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
// HttpSession session = request.getSession();
String strServletPath = request.getServletPath();
// debug
System.out.println(strServletPath);
// end of debug
int intServletpath = 0;
if (strServletPath.equalsIgnoreCase("/welcome.do")) {
intServletpath = 1;
}
if (strServletPath.equalsIgnoreCase("/verify.do")) {
intServletpath = 2;
}
if (strServletPath.equalsIgnoreCase("/searchRoot.do")) {
intServletpath = 3;
}
switch (intServletpath) {
case 1: {// welcome.do
RequestDispatcher requestDispatcher = request
.getRequestDispatcher("./JSP/welcome.jsp");
requestDispatcher.forward(request, response);
break;
}
case 2: { // verify.do
if (service.isVideoFile(request.getParameter("path_name"))) {
String strVideoPath = service.findRelative(request
.getParameter("path_name"));
request.setAttribute("VIDEO_PATH", FileUtil.adjustPathName(strVideoPath));
RequestDispatcher requestDispatcher = request
.getRequestDispatcher("./JSP/video.jsp");
requestDispatcher.forward(request, response);
}
else {
List<SearchResult> listSearchResults = service
.searchDirectory(request.getParameter("path_name"));
request.setAttribute("LIST_SEARCH_RESULT", listSearchResults);
RequestDispatcher requestDispatcher = request
.getRequestDispatcher("./JSP/search.jsp");
requestDispatcher.forward(request, response);
}
break;
}
case 3: {// searchRoot.do
List<SearchResult> listSearchResults = service
.searchRootDirectory();
request.setAttribute("LIST_SEARCH_RESULT", listSearchResults);
RequestDispatcher requestDispatcher = request
.getRequestDispatcher("./JSP/search.jsp");
requestDispatcher.forward(request, response);
break;
}
}
}
}
VappServiceImpl.java
package com.cluster.vapp.service;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.cluster.vapp.fileutils.FileUtil;
import com.cluster.vapp.fileutils.SearchResult;
public class VappServiceImpl implements VappService{
public static final String ROOT_PATH = "F:\\apache-tomcat-7.0.33\\webapps\\balaji\\ROOT-VIDEO";
public static final String BASE_PATH = "F:\\apache-tomcat-7.0.33\\webapps\\balaji";
public List<SearchResult> searchRootDirectory() {
List<String> listDirectoryNames = FileUtil.fetchFileNames(ROOT_PATH);
List<SearchResult> listSearchResults = new ArrayList<SearchResult>();
for (String dirName : listDirectoryNames) {
SearchResult result = new SearchResult();
result.setStrName(dirName);
result.setStrPath(ROOT_PATH + "\\" + dirName);
listSearchResults.add(result);
}
return listSearchResults;
}
public boolean isVideoFile(String pStrPath) {
File file = new File(pStrPath);
// System.out.println("Is file There: " + file.exists());
if (file.isFile())
return true;
else
return false;
}
public List<SearchResult> searchDirectory(String pStrPath) {
List<String> listDirectoryNames = FileUtil.fetchFileNames(pStrPath);
List<SearchResult> listSearchResults = new ArrayList<SearchResult>();
for (String dirName : listDirectoryNames) {
SearchResult result = new SearchResult();
result.setStrName(dirName);
result.setStrPath(pStrPath + "\\" + dirName);
listSearchResults.add(result);
}
return listSearchResults;
}
public String findRelative(String pStrVideoPath){
return FileUtil.findRelativePath(BASE_PATH, pStrVideoPath);
}
}
FileUtil.java
package com.cluster.vapp.fileutils;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.cluster.vapp.fileutils.exceptions.InvalidAbsolutePathException;
import com.cluster.vapp.fileutils.exceptions.InvalidDirectoryNameException;
/**
* @author Balaji.K.R
*
* @version 1.0
*
* The class Contains methods for various file operations. All methods
* present will accept only absolute string path of the source and
* destination file structure.
*
*/
public class FileUtil {
/**
* The Method returns the names of the files as a list, in the path given.
*
* Note: The path name should be a absolute path, and should be a existing
* directory. Any violation will lead to corresponding run-time exception.
*
*
* @param pStrDirectory
* Location of the directory where it needs to be searched.
* @return List of file names as string existing in the directory.
*/
public static List<String> fetchFileNames(String pStrDirectory) {
List<String> listFileNames = new ArrayList<String>();
File directory = new File(pStrDirectory);
if (directory.isAbsolute() == false) {
throw new InvalidAbsolutePathException(
"Directory Path is not Absolute");
}
if ((directory.exists() && directory.isDirectory()) == false) {
throw new InvalidDirectoryNameException();
}
String[] strFileNames = directory.list();
for (String name : strFileNames) {
listFileNames.add(name);
}
return listFileNames;
}
public static String adjustPathName(String pStrPath) {
StringBuilder sb = new StringBuilder(pStrPath);
sb.insert(0, "../");
return sb.toString();
}
public static String findRelativePath(String pStrBasePath,
String pStrAbsolutePath) {
return new File(pStrBasePath).toURI()
.relativize(new File(pStrAbsolutePath).toURI()).getPath();
}
}
ようこそ.jsp
<!DOCTYPE html>
<html>
<head>
<title>Cluster Video App</title>
</head>
<body>
<h1>Cluster Video Application</h1>
<br></br>
<br></br>
<br></br>
<br></br>
<h1><a href="./searchRoot.do">Browse Videos</a></h1>
</form>
</body>
</html>
search.jsp
<!DOCTYPE html>
<%@page isELIgnored="false"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="jstl"%>
<html>
<head>
<title>Cluster Video App</title>
<script type="text/javascript"> function submitForm(form){form.submit();} </script>
<style type="text/css"> div.label{font-size: 30px; color: blue; margin: 10px;} </style>
</head>
<body>
<h1>Click to proceed...</h1>
<jstl:forEach var="result"
items="${requestScope.LIST_SEARCH_RESULT}">
<form action="./verify.do" method="post">
<div class="label">
${result.strName} <input type="button" value="Go" onclick="submitForm(this.form);"/>
<input type="hidden" name="path_name" value="${result.strPath}">
</div>
</form>
</jstl:forEach>
</body>
</html>
video.jsp
<!doctype html>
<html>
<head>
<title>Cluster Video App</title>
<script type="text/javascript">
</script>
</head>
<body>
<h1>Enjoy the Video</h1>
<video controls autoplay width="512" height="288">
<source src="${requestScope.VIDEO_PATH}"> </source>
</video>
</body>
</html>