2012-01-05 16 views
6

Robię funkcję Eksport do HTML5 gry w kopalni, a moja obecna metoda oszczędzania jest surowy serializacji danych gier, a następnie:Chrome zawiesza się podczas URI jest zbyt długi

// this is Javascript 
var gameData = "abc"; // this is actually a HUGE string of over 2MB 
try 
{ 
    document.location = "data:text/octet-stream,"+encodeURIComponent(JSON.stringify(gameData)); 
} 
catch(e) 
{ 
    console.log(e); 
} 

Od: Using HTML5/Javascript to generate and save a file

Nie mam nic przeciwko temu, że nie mogę użyć go do dużych ciągów, ale chcę wygenerować ostrzeżenie, które informuje, że ta metoda nie działa, niestety Chrome (16) ulega awarii bez przechwytywania tego wyjątku .

Czy istnieje lepszy sposób wdrożenia tego rodzaju eksportu, ważne jest dla mnie, aby działał on lokalnie. FileAPI byłby lepszym rozwiązaniem, ale nie działa lokalnie.

+1

Co dokładnie upaść? 'document.location =' lub 'encodeURI'? – rds

+0

Gdzie chcesz eksportować? Po stronie serwera? Czy zapisać tylko stronę klienta? – rds

+1

Najwyraźniej chce wyeksportować stronę klienta. A co się z tym zdarza to document.location –

Odpowiedz

1

AFAIK nie możliwe po stronie klienta; ale plik 1,99 MB można zapisać w ten sposób w Chrome; może powinieneś spróbować skompresować/zoptymalizować swoje dane gry. Jednym ze sposobów na to jest użycie JSZip.

W celu sprawdzenia, czy obecny jest przeglądarka Google Chrome i dlatego metoda nie działa z długich łańcuchów można użyć coś takiego:

if(gameData.length > 1999999 && window.chrome){ 
    alert("Sorry, this export method does not work in Google Chrome") 
    return; 
} 
+0

Nie przeszkadza mi, że to nie działa, wiem, jak zrobić plik zapisu jest mniejszy, ale nie chcę, żeby się zawiesił i nie znam żadnej innej metody niż 'try/catch'. – Solenoid

+4

Chrome ulega awarii na poziomie głębszym niż Twój kod JavaScript. Nie możesz złapać tego błędu; możesz tylko zrobić wszystko, aby uniknąć okoliczności, które go powodują. –

0

Zakładam, że JSON.stringify pracuje Ale lokalizacja win.location nie powiodła się z powodu dużego rozmiaru URI.

Co można zrobić, to przekonwertować URI do blob, a następnie

URL.createObjectURL(file) 

To stworzy url które wskazują na przedmiot wewnętrznej (wewnętrzny do przeglądarki).

I będzie działać zgodnie z oczekiwaniami.

Oto metoda konwersji dataURI do blob

function(dataURI) { 
    // convert base64 to raw binary data held in a string 
    // doesn't handle URLEncoded DataURIs 
    var byteString; 
    if (dataURI.split(',')[0].indexOf('base64') >= 0) 
     byteString = atob(dataURI.split(',')[1]); 
    else 
     byteString = unescape(dataURI.split(',')[1]); 
    // separate out the mime component 
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; 

    // write the bytes of the string to an ArrayBuffer 
    var ab = new ArrayBuffer(byteString.length); 
    var ia = new Uint8Array(ab); 
    for (var i = 0; i < byteString.length; i++) { 
     ia[i] = byteString.charCodeAt(i); 
    } 

    // write the ArrayBuffer to a blob, and you're done 
    return new Blob([ab],{type: mimeString}); 
} 

}

Powiązane problemy