JavaScriptFAQ(十九)——檔案訪問

kjmeng發表於2009-07-14

十六、檔案訪問(File Access)

 

1、讀取檔案(Reading a File

Q:如何將檔案讀取到JavaScript變數中?

A:根據指令碼執行的環境和檔案的位置,你可以有以下選項:

  • XMLHttpRequest 物件(通過URL讀取網站上可用的檔案)
  • FileSystemObject(如果你在一個被信任的環境下使用Windows Scripting Hosting或者IE)
  • 一個讀取檔案或者URL的“助手”Java applet

 關於前兩個選項的討論,請點選上面的超連結。

下面我們會討論最後的一個——為指令碼讀取檔案的Java applet助手。讀取檔案機制的一個可能實現如下:

1. 指令碼呼叫applet的一個public方法。

2. 這個public方法在applet的另一個執行緒中初始化讀取過程,然後返回。

3. Applet中另一個執行緒中的讀取過程繼續執行。同時,指令碼持續問applet是否完成讀取。

4. Applet完成讀取,把檔案內容放在applet的一個public的字串變數中。

5. 指令碼看到applet完成讀取。

6. 指令碼將檔案內容從applet的public變數中複製到JavaScript的變數。

      注意未簽名的Java applet程式碼只能讀取那些和程式碼有同一來源(the same origin)的檔案。例如,如果你的未簽名程式碼被髮布在一個Web伺服器上,那麼它只允許通過URL閱讀在同一個Web伺服器上檔案。如果你的程式碼在本地的磁碟上,那麼(最多)它只能閱讀在同一個磁碟上的檔案。

      如果你想閱讀有不同來源的檔案,你需要對程式碼簽名。(更多資訊,請參考寫檔案;十分相似的安全機制應用於讀取那些和程式碼沒有相同來源的檔案。)

      這裡有一個實現了上述讀取機制的簡單的例子。下面的矩形是一個叫做ReadURL.class的Java applet。這個Applet讀取選擇的檔案內容到一個public變數fileContent中。完成時,applet將它的public變數finished設為1。

Applet好像不被支援,請到原文處操作例項–譯者注

      示例中的指令碼讀取選擇檔案,這個檔案包含了一個這個FAQ討論的一些內容。

Choose a file to readJavaScript FAQ Home (file startpag.htm)Reading a File (file reading2.htm)Writing a File (file writinga.htm)

      啟動讀取程式的JavaScript程式碼如下:

var fileContent=``;
var theLocation=``;

function readFileViaApplet(n) {
 document.f1.t1.value=`Reading in progress...`;
 document.ReadURL.readFile(theLocation);
 setTimeout("showFileContent()",100);
}

function showFileContent() {
 if (document.ReadURL.finished==0) {
  setTimeout("showFileContent()",100);
  return;
 }
 fileContent=document.ReadURL.fileContent;
 document.form1.textarea1.value=fileContent;
}

 

2. 寫檔案(Writing a File

Q:如果通過JavaScript寫檔案?

A:通過JavaScript寫檔案和從Java Applet寫檔案一樣簡單。指令碼本身不能寫檔案,它需要呼叫一個Java applet的public方法為它完成所有寫檔案的工作。

壞訊息是:

1. 寫檔案是一個授權操作,因此你的applet必須已經有數字簽名以便寫檔案。

2. 針對Internet Explorer的Applet簽名和針對Netscape Navigator的完全不同。

3. 已簽名的applet在Netscape Navigator 3中也可能不正產工作。

4. 最壞的是,把授權操作放在已簽名的applet的public方法中是非常不安全。如果你釋出了這樣一個applet,惡意程式碼可以很容易的推翻applet的public方法,你(applet釋出者/簽署者)將會因為任何破壞被起訴。

因此,儘管在主流瀏覽器的版本4中技術上可行,沒有人通過簽名的applet釋出寫檔案的指令碼。


相關文章