2016-10-10 83 views
1

我正在嘗試下載大型json數據。 但它導致Uncaught RangeError: Invalid string length如何解決下載大尺寸時未捕獲的RangeError json

enter image description here

請幫助解決這個問題,在此先感謝。

這裏是的jsfiddle:http://jsfiddle.net/sLq3F/456/

+7

你試圖獲取一個** 181兆字節的文件**。 (請注意閱讀這個問題的人:如果你點擊那個小提琴鏈接,準備好讓你的CPU風扇旋轉起來。) – Pointy

+0

是的,在那裏兩次串起大量數據。該數據對象中的數組有206560個項目。 –

+0

因爲這裏沒有問題,所以沒有得到足夠的關注。有錯誤消息和鏈接。 –

回答

2

您可以使用fetch()Response.body.getReader()返回一個ReadableStreamTextDecoder()Blob()URL.createObjectURL()

注意,在裝置中的.crdownload擴展之前具有有限RAM或低可用磁盤空間,點擊SaveSave File對話框4分鐘二十秒4:20Save File對話關閉之前過去之後,隨後是附加的一分鐘,30秒1:30已從文件管理器GUI的文件中刪除。在文件下載到文件系統的第一個4:20期間,可以看到Save File對話框,但鼠標指針是可移動的,儘管UI暫時無法響應點擊或嘗試更改制表符。當Save File對話框關閉並且文件仍在下載到文件系統時,如果擴展名爲.crdownload,UI將返回正常功能。

在上述過程結束時,文件被成功下載到總大小爲189.8 MB (189,778,220 bytes)的本地文件系統。

<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <style> 
 
    code { 
 
     color:navy; 
 
     background-color:#eee; 
 
     padding:2px; 
 
    } 
 
    </style> 
 
</head> 
 

 
<body> 
 
    <button>Request File</button><br> 
 
    <progress min="0" max="189778220" value="0"></progress> 
 
    <output></output> 
 
    <br><br> 
 
    <label></label> 
 
    <script> 
 
    var url = "https://raw.githubusercontent.com/zemirco/sf-city-lots-json/master/citylots.json"; 
 
    var button = document.querySelector("button"); 
 
    var progress = document.querySelector("progress"); 
 
    var label = document.querySelector("label"); 
 
    var output = document.querySelector("output"); 
 
    
 
    var request = (url) => { 
 
     
 
     label.innerHTML = `Requesting <code>${url}</code> at ${new Date()}.<br><br>`; 
 
     
 
     return fetch(url) 
 
     .then(response => response.body.getReader()) 
 
     .then(reader => { 
 
     var decoder = new TextDecoder(); 
 
     var json = ""; 
 
     label.innerHTML += `Request successful.<br><br>Reading request body at ${new Date()}.<br><br>`; 
 
     return reader.read().then(function processData(result) { 
 
      if (result.done) { 
 
       // do stuff when `reader` is `closed` 
 
       return reader.closed.then(function() { 
 
       // return `json` string 
 
       return json; 
 
       }); 
 
      }; 
 
      json += decoder.decode(result.value); 
 
      output.innerHTML = ` ${json.length} of ${progress.max} bytes read`; 
 
      progress.value = json.length; 
 
      return reader.read().then(processData) 
 
      }) 
 
      .then(function(data) { 
 
      var message = `Reading of <code>${url}</code> complete at ${new Date()}. <br><br>` 
 
           + `${data.length} total bytes read. ` 
 
           + `Please allow up to 4 minutes for file to download ` 
 
           + `to filesystem after clicking <code>Save</code>.<br><br>`; 
 
      label.innerHTML += message; 
 
      
 
      var blob = new Blob([data], { 
 
       type: "application/json" 
 
      }); 
 
      var file = URL.createObjectURL(blob); 
 
      var a = document.createElement("a"); 
 
      a.download = "citylots.json"; 
 
      a.href = file; 
 
      document.body.appendChild(a); 
 
      a.click(); 
 
      var closeBlob = (e) => { 
 
       window.removeEventListener("focus", closeBlob); 
 
       blob.close(); 
 
       URL.revokeObjectURL(file); 
 
      }; 
 
      window.addEventListener("focus", closeBlob); 
 
      return message.replace(/<[^>]*>/g, ""); 
 
      }) 
 
      .catch(function(err) { 
 
      console.log("err", err) 
 
      }) 
 
     }); 
 
    } 
 
    
 
    var handleRequest = (e) => { 
 
     button.setAttribute("disabled", "disabled"); 
 
     request(url).then(function(message) { 
 
     console.log(message); 
 
     button.removeAttribute("disabled"); 
 
     }) 
 
    }; 
 
    
 
    button.addEventListener("click", handleRequest); 
 
    </script> 
 
</body> 
 
</html>

plnkr https://plnkr.co/edit/gewixzHZSKRXquZ2OVF2?p=preview

+0

當我點擊button.it似乎加載,但花了一些時間後,導致DevTools從該頁面斷開。請幫助我,.. – selvarajmas

+1

@selvarajmas點擊「保存」後花了4分鐘用於保存文件對話框關閉。在文件寫入本地文件系統完成之前又過了一分半鐘。您試過的設備有多少「RAM」? – guest271314

+0

我已安裝內存(RAM)3GB – selvarajmas

0

我猜你會需要遍歷JSON文件的東西,把它分解成更易於管理的字符串。

Tom

您是否有一個片段JSON文件的例子?

+0

我需要更正jsfiddle – selvarajmas

0

你有在PHP上運行的服務器嗎?

如果你這樣做,我相信你絕對必須檢查你的php.ini文件或因爲PHP設置確實限制文件大小的轉移,即使它不是外部請求運行的phpinfo頁面。它可以在其他語言中這樣做,但除了PHP以外,我從來沒有遇到過這個問題。

P.S.我沒有看到文件的大小

0

我認爲你的json文件是「超大JSON」場景之一。你知道,如果json文件有這麼多的記錄(準確地說,基於測試,100000條記錄會導致瀏覽器掛起,而且更多的瀏覽器無法加載),不建議使用它。

你可以閱讀這篇文章以瞭解更多信息:HOW BIG IS TOO BIG FOR JSON?

相關問題