2012-08-07 62 views
1

我一直在研究一個音頻播放器小程序,並且遇到了讓它在網絡瀏覽器中運行的問題。它在eclipse中的applet viewer中非常完美,但是當我在Google Chrome中嘗試時它不起作用。我甚至嘗試過生成的eclipse生成的applet文件,但它也不起作用,可能與eclipse運行它的方式有關。Applet文件訪問

這是HTML文件,但不允許訪問MP3文件,或特殊字體我做:

<html> 

<meta http-equiv="Content-Type" content="text/html; charset=MacRoman"/> 

<body> 

<applet code="DOSPlayer.class" archive="DOSPlayer.jar, basicplayer3.0.jar, commons-logging-1.1.1.jar, mp3spi1.9.5.jar, tritonus_share-0.3.6.jar, jl1.0.1.jar" width="450" height="350" > 

</applet> 

</body> 

</html> 

錯誤我得到的,因爲它無法訪問文件因爲訪問權限:

java.security.AccessControlException: access denied (java.io.FilePermission fonts\DOSFont.ttf read) 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkRead(Unknown Source) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at DOSPlayer.initFont(DOSPlayer.java:398) 
    at DOSPlayer.<init>(DOSPlayer.java:413) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at java.lang.Class.newInstance0(Unknown Source) 
    at java.lang.Class.newInstance(Unknown Source) 
    at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
java.lang.reflect.InvocationTargetException 
    at com.sun.deploy.util.DeployAWTUtil.invokeAndWait(Unknown Source) 
    at sun.plugin2.applet.Plugin2Manager.runOnEDT(Unknown Source) 
    at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source) 
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.security.AccessControlException: access denied (java.io.FilePermission mp3 read) 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkRead(Unknown Source) 
    at java.io.File.list(Unknown Source) 
    at java.io.File.listFiles(Unknown Source) 
    at DOSPlayer.getFiles(DOSPlayer.java:259) 
    at DOSPlayer.<init>(DOSPlayer.java:415) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at java.lang.Class.newInstance0(Unknown Source) 
    at java.lang.Class.newInstance(Unknown Source) 
    at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
Exception: java.lang.reflect.InvocationTargetException 

我知道錯誤是由代碼這兩個片段來:

 //path is "mp3/" 
public String[] getFiles(String path) { 

       String[] songs = new String[501]; 
       String files; 
       File folder = new File(path); 
       File[] listOfFiles = folder.listFiles(); 
       //gets all mp3 files within mp3 folder 
      try { 
       for (int i = 0; i < listOfFiles.length; i++) { 

       if (listOfFiles[i].isFile()) 
       { 
       files = listOfFiles[i].getName(); 
        if (files.endsWith(".mp3")) { 
          songs[songNum] = files; 
          songNum++; 
          playableSongs++; 
        } 
       } 
       } 
      } catch (Exception e) { 
       System.out.println("Error Here"); 
       e.printStackTrace(); 
       return null; 
      } 
       return songs; 


} 

///////////////////////////////// 

public void initFont() { 
     try { 
      //URL fontUrl = new URL("fonts/DOSFont.ttf"); 
      File file = new File("fonts/DOSFont.ttf"); // where ever it is from 

      FileInputStream fontPath = new FileInputStream(file); 
      dosFont = Font.createFont(Font.TRUETYPE_FONT, fontPath);//fontUrl.openStream()); 
      dosFont = dosFont.deriveFont(Font.PLAIN,19); 
      GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
      ge.registerFont(dosFont); 
      font = true; 
       } catch(Exception e) { 
        e.printStackTrace(); 
        font = false; 
       } 
    } 

我已經嘗試過對小程序進行簽名,但這不起作用,它授予對從網頁查看小程序的人員訪問文件的權限。我也嘗試編輯策略文件,但我無法讓它工作,但它仍然是一個選項。

我有這個幾個小時的麻煩,不知道該怎麼做,任何幫助將不勝感激。

+0

如何調用getFiles(...)方法? – user592704 2012-08-07 21:48:51

+0

File file = new File(「fonts/DOSFont.ttf」);客戶機上真的存在嗎? – user592704 2012-08-07 21:50:13

+0

是的,它存在。它只是不允許訪問它。 – M4trixSh4d0w 2012-08-07 21:54:09

回答

2

這些資源(尤其是字體)實際上是「應用程序資源」,可以添加到Jar中並添加到小程序的運行時類路徑中。如果不在檔案中,則應將其添加到服務器上的公共場所(可直接從瀏覽器訪問它們)。

一旦進入Jar或在服務器上,它們可以通過URL訪問。如果沒有嵌入到Jar中,URL可以形成爲代碼或文檔庫的相對路徑。如果他們是在一個罐子裏,使用像得到一個URL:

URL urlToFont = this.getClass().getResource("/path/in/jar/to/the.ttf"); 

我也試過編輯策略文件,我不能得到那個工作,但它仍然是一種選擇。

不,它不能。策略文件適用於一系列非常有限的事情,公開部署的小應用程序不是其中之一。


而就只是一個快速評論...

File[] listOfFiles = folder.listFiles(); 

這將需要重新考慮。沒有服務器的幫助,小程序無法獲取服務器上的文件列表。要定義一組文件,applet通常會有一個接受路徑/名稱的參數。

+0

是的,我做了一個文本文件中的文件列表讀取 – M4trixSh4d0w 2012-08-09 05:21:18