2013-02-08 78 views
0

我是javascripting的新手,我有這段代碼。在此代碼中,您可以選擇一個文件,然後查看它的第一個A-B字節,B-C字節或整個文件。 演示此代碼:http://www.html5rocks.com/en/tutorials/file/dndfiles/ - 標題:切片文件。Javascript - 切片文件 - 需要修改javascript

  1. 問題:如何設置永久文件在此腳本中使用,而不是上傳隨機文件的機會? (例如,我有文件test.html,並且我希望它是該腳本正在使用的唯一一個文件)。

  2. 問題:當我上傳一個html文件時,腳本沒有顯示該文件的部分內容,但它顯示了該文件的源代碼部分。例如,如果上傳的文件包含圖像標籤,則結果中看不到圖片,但只有完全重寫的源代碼。有沒有什麼辦法如何JavaScript的結果將像在HTML中書寫的正常頁面?

也許這是有人擅長這種原始的問題,但隨着C語言klowledge我的編程知識結束,當我學習到PHP或JavaScript,我只是猜測。大多數我succesfull時代,但不是現在:(

感謝名單每個答案!

<style> 
    #byte_content { 
    margin: 5px 0; 
    max-height: 100px; 
    overflow-y: auto; 
    overflow-x: hidden; 
    } 
    #byte_range { margin-top: 5px; } 
</style> 

<input type="file" id="files" name="file" /> Read bytes: 
<span class="readBytesButtons"> 
    <button data-startbyte="0" data-endbyte="4">1-5</button> 
    <button data-startbyte="5" data-endbyte="14">6-15</button> 
    <button data-startbyte="6" data-endbyte="7">7-8</button> 
    <button>entire file</button> 
</span> 
<div id="byte_range"></div> 
<div id="byte_content"></div> 

<script> 
    function readBlob(opt_startByte, opt_stopByte) { 

    var files = document.getElementById('files').files; 
    if (!files.length) { 
     alert('Please select a file!'); 
     return; 
    } 

    var file = files[0]; 
    var start = parseInt(opt_startByte) || 0; 
    var stop = parseInt(opt_stopByte) || file.size - 1; 

    var reader = new FileReader(); 

    // If we use onloadend, we need to check the readyState. 
    reader.onloadend = function(evt) { 
     if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
     document.getElementById('byte_content').textContent = evt.target.result; 
     document.getElementById('byte_range').textContent = 
      ['Read bytes: ', start + 1, ' - ', stop + 1, 
      ' of ', file.size, ' byte file'].join(''); 
     } 
    }; 

    var blob = file.slice(start, stop + 1); 
    reader.readAsBinaryString(blob); 
    } 

    document.querySelector('.readBytesButtons').addEventListener('click', function(evt) { 
    if (evt.target.tagName.toLowerCase() == 'button') { 
     var startByte = evt.target.getAttribute('data-startbyte'); 
     var endByte = evt.target.getAttribute('data-endbyte'); 
     readBlob(startByte, endByte); 
    } 
    }, false); 
</script> 
+0

即使使用新的File Api,如果沒有用戶交互,您無法從磁盤讀取文件,因此無法進行「默認」文件選擇 – 2013-02-08 14:52:04

+0

如果您自己提供文件,只需將它加入並從中顯示htmlfragments – mplungjan 2013-02-08 14:58:29

回答

1
  1. 號爲安全起見,你可以不直接與文件系統,而無需用戶交互決策文件的選擇。想象一下,有人做upload 'known/path/to/passwords'

  2. 這是混淆。在內容源代碼是不同的想法。ÿ你是混音級別。文件包含內容。並且文件中的源代碼可以表示一個文檔。但你不上傳文件。您上傳一個文件,即代表該源代碼的一組字節。任何將其作爲文檔的解釋都是您需要執行的獨立工作。

0

問題1:我如何可以設置該腳本中使用的永久文件,而不是上傳隨機文件的機會呢?

如果沒有他明確地「上傳」它們,您將無法訪問用戶計算機上的任何文件。其他任何事情都會成爲安全問題。但是,某些「應用程序」(瀏覽器擴展等)可以擁有此權限,並且在某些瀏覽器中可以禁用安全性。

要每次加載特定的文件,您應該使用ajax請求到網絡中。

問題:當我上傳一個html文件時,腳本沒有顯示該文件的部分內容,但它顯示了該文件的源代碼部分。

這就是它應該如何工作。該html文件只包含標記;該圖片是不同的文件。

有沒有什麼辦法如何JavaScript的結果將像在普通的網頁寫在HTML?

當然,您可以通過將它寫入iframe或其他東西來呈現HTML源代碼。但它不會訪問本地文件的圖像。