2010-02-03 13 views

Odpowiedz

1

Zakładając, że starają się odczytywać i zapisywać na dysku z poziomu przeglądarki i nie node.js, pierwszym krokiem jest użycie input tag typu file aby uzyskać dostęp do systemu plików.

<!DOCTYPE html> 
<head> 
    <meta charset="UTF-8"> 
</head> 
<body> 
    <input type="file" id="input" accept="text/xml"> 
    <script src="script.js"></script> 
</body> 

Po wybraniu pliku chcemy wyodrębnić obiekt typu blob z elementu. Dobra okazja, aby to zrobić, to podczas wydarzenia związanego ze zmianą.

const input = document.querySelector('#input'); 

input.addEventListener('change',() => { 
    const file = input.files.item(0); 
}); 

Istnieje więcej niż jeden sposób, aby przeanalizować obiekt typu blob w drzewie elementów. Tutaj skorzystałem z faktu, że przeglądarka analizuje dokumenty XML w żądaniach HTTP.

function blobToDocument(blob, callback) { 
    const url = URL.createObjectURL(blob); 
    const request = new XMLHttpRequest(); 
    request.open('Get', url); 
    request.responseType = 'document'; 
    request.addEventListener('load',() => { 
    callback(request.response); 
    }); 
    request.send(); 
} 

Po przeanalizowaniu tego obiektu, możemy nim manipulować tak, jak manipulujemy drzewem DOM.

function editDocument(document) { 
    const element = document.createElement('editor'); 
    element.textContent = 'JavaScript'; 
    document.firstChild.appendChild(element); 
    return document; 
} 

Aby zapisać plik na dysku musimy odwrócić proces analizowania, konwersji drzewo elementów z powrotem do łańcucha.

function documentToString(document) { 
    const serializer = new XMLSerializer(); 
    return serializer.serializeToString(document); 
} 

Pozostaje tylko wysłać plik z powrotem na dysk. Aby to osiągnąć, możemy wywołać zdarzenie kliknięcia na łączu z naszym zmodyfikowanym plikiem.

function download(string, mime) { 
    const blob = new Blob([string], { type: mime }); 
    const a = document.createElement('a'); 
    const url = URL.createObjectURL(blob); 
    a.href = url; 
    a.download = 'document.xml'; 
    a.click(); 
} 

Oto kompletny kod

const input = document.querySelector('#input'); 
 

 
input.addEventListener('change',() => { 
 
    const file = input.files.item(0); 
 
    blobToDocument(file, (xmlDocument) => { 
 
    editDocument(xmlDocument); 
 
    download(documentToString(xmlDocument), "text/xml"); 
 
    }); 
 
}); 
 

 
function blobToDocument(blob, callback) { 
 
    const url = URL.createObjectURL(blob); 
 
    const request = new XMLHttpRequest(); 
 
    request.open('Get', url); 
 
    request.responseType = 'document'; 
 
    request.addEventListener('load',() => { 
 
    callback(request.response); 
 
    }); 
 
    request.send(); 
 
} 
 

 
function editDocument(document) { 
 
    const element = document.createElement('editor'); 
 
    element.textContent = 'JavaScript'; 
 
    document.firstChild.appendChild(element); 
 
    return document; 
 
} 
 

 
function documentToString(document) { 
 
    const serializer = new XMLSerializer(); 
 
    return serializer.serializeToString(document); 
 
} 
 

 
function download(string, mime) { 
 
    const blob = new Blob([string], { type: mime }); 
 
    const a = document.createElement('a'); 
 
    const url = URL.createObjectURL(blob); 
 
    a.href = url; 
 
    a.download = 'document.xml'; 
 
    a.click(); 
 
}
<!DOCTYPE html> 
 
<head> 
 
    <meta charset="UTF-8"> 
 
</head> 
 
<body> 
 
    <input type="file" id="input" accept="text/xml"> 
 
    <script src="script.js"></script> 
 
</body>

Powiązane problemy