0

ファイルの絶対パスと相対パスを使用して Tomcat 7 サーバーからビデオが再生されない:

要約の編集: 相対パスの例を変更し、ビデオをアプリケーションのルート フォルダー内に配置しています (まだビデオのバグを解決できません)。

ローカルで使用するためのビデオ表示用の小さなアプリケーションを構築しています。HTML-5 はビデオの表示を強力にサポートするため、単純なサーブレット/JSP を使用してプログラムを作成し、それをTomcat 7 Web サーバーにデプロイすることにしました。

アプリケーション ロジックは次のとおりです。

  1. ルート パス (絶対パス) は、Tomcat のアプリケーションのルート フォルダーに設定されます。
  2. ルート内のすべてのファイルとディレクトリが表示され、横に「移動」ボタンが表示されます。
  3. 「go」をクリックしてフォルダ内の動画ファイルを選択すると、動画閲覧ページが表示されます。
  4. 動画ファイルの関連情報は、動画タグのソースへの式言語 (EL) を使用して動画ページに提供されます。
  5. ビデオは、localhost のハード ディスクからすべてのブラウザー エンドポイントに再生する必要があります。

私が直面している問題は、私のビデオがTomcatサーバーから再生されていないことですが、ビデオが正常に動作しているファイルにコピーして貼り付けたときに、ブラウザで同じレンダリングされたhtmlの「ソース」コードです。tomcatサーバーから動作させるには?

編集後: Tomcat myapp のルート フォルダー内の相対パスを調整するようにアプリを変更しましたが、まだ機能していません。以下は編集された質問です。

私のアプリのスクリーンショットは次のとおりです。


ステージ 1: リンクをクリックする

ステージ1


ステージ 2: 参照するビデオまたはフォルダを選択します

ステージ 2


ステージ 3: ビデオを再生します (ここでエラーが発生します) ステージ 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>

ビデオはアプリケーションのルート ディレクトリにあります。

Tomcat ルート - ビデオ ルート

編集したプログラムを参考のためにこのページに貼り付けました。私を修正し、ビデオのバグを解決するのを手伝ってください。



プログラム

パッケージ構造:

パッケージ構造


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>
4

3 に答える 3

3

それはセキュリティ上の理由からです。一部のサーバーからロードされたページは、ローカル ドライブからファイルをロードできません。ビデオを src/main/webapp/video.m4v にコピーします。JSP を次のように変更します。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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="<c:url value="/video.m4v" />"> </source>
    </video>
</body>
</html>
于 2013-05-30T10:50:49.433 に答える
0

フォルダーをWebContentフォルダーまたはwebappsフォルダー内に配置し、. /folder1/file.mp4のようなパスを 指定します ( WebContentが存在しない 場合)。次に、 DynamicWebProjectで Eclipse を使用して新しいプロジェクト セットアップを作成し、その中にツアー ファイルを貼り付けます。

私もこの問題を抱えていますが、今は[解決済み]で、 Tomcat 8とJava 7 を使用しています

于 2016-01-29T06:59:26.440 に答える