Dostęp protokół file:
przy użyciu XMLHttpRequest()
chromu lub <link>
elementu bez --allow-file-access-from-files
flagę ustawioną na przykład chrom premiery nie jest domyślnie włączona.
--allow-file-access-from-files
Domyślnie file: // URI nie może czytać inne file: // URI. Jest to nadpisanie dla programistów, którzy potrzebują starego zachowania do testowania.
W chwili obecnej, ze względu na politykę bezpieczeństwa Chromium nie może odczytać lokalnych plików za pośrednictwem AJAX bez --allow-file-access-from-files
. Ale I obecnie trzeba utworzyć aplikację internetową, w której bazą danych jest plik xml- (w skrajnym przypadku, json), umieszczony w jednym katalogu z index.html. Rozumie się, że użytkownik może lokalnie uruchomić tę aplikację. Czy są jakieś obejścia do odczytu pliku xml- (json-), bez zawijania go w funkcję i zmiany na rozszerzenie js?
Jeśli użytkownik jest świadomy, że lokalne pliki mają być używane przez aplikację można wykorzystać <input type="file">
element dla użytkownika, aby przesłać plik z lokalnego systemu plików użytkownika, plik proces wykorzystujący FileReader
, a następnie przystąpić do aplikacji.
Ewentualnie, należy poinformować użytkownika, że korzystanie z aplikacji wymaga uruchomienia chromu z zestawem flag --allow-file-access-from-files
, co można wykonać, tworząc w tym celu program uruchamiający, określając inny katalog danych użytkownika dla wystąpienia chromu. Wyrzutnia może być, na przykład
/usr/bin/chromium-browser --user-data-dir="/home/user/.config/chromium-temp" --allow-file-access-from-files
Patrz także How do I make the Google Chrome flag “--allow-file-access-from-files” permanent?
Powyższe polecenie może być również prowadzony w terminal
$ /usr/bin/chromium-browser --user-data-dir="/home/user/.config/chromium-temp" --allow-file-access-from-files
bez tworzenia wyrzutnię pulpitu; gdzie, gdy przypadek chromu jest zamknięty, usuń katalog konfiguracyjny dla wystąpienia chromu.
Gdy flaga jest ustawiona, użytkownik może zawierać <link>
element z atrybutem rel="import"
i href
wskazując do lokalnego pliku i type
zestaw do "application/xml"
, na opcję inną niż XMLHttpRequest
uzyskania pliku. Dostęp XML
document
użyciu
const doc = document.querySelector("link[rel=import]").import;
Zobacz Is there a way to know if a link/script is still pending or has it failed.
Inną alternatywą, choć bardziej zaangażowani, byłoby wykorzystanie requestFileSystem
aby zapisać plik na LocalFileSystem
.
Zobacz
albo utworzyć lub zmodyfikować aplikację Chrome i użyć
chrome.fileSystem
Se e GoogleChrome/chrome-app-samples/filesystem-access.
Najprostszym rozwiązaniem byłoby zapewnienie sposobu przesyłania plików przez pozytywne działanie użytkownika; przetwarzać przesłany plik, a następnie kontynuować korzystanie z aplikacji.
const reader = new FileReader;
const parser = new DOMParser;
const startApp = function startApp(xml) {
return Promise.resolve(xml || doc)
};
const fileUpload = document.getElementById("fileupload");
const label = document.querySelector("label[for=fileupload]");
const handleAppStart = function handleStartApp(xml) {
console.log("xml document:", xml);
label.innerHTML = currentFileName + " successfully uploaded";
// do app stuff
}
const handleError = function handleError(err) {
console.error(err)
}
let doc;
let currentFileName;
reader.addEventListener("loadend", handleFileRead);
reader.addEventListener("error", handleError);
function handleFileRead(event) {
label.innerHTML = "";
currentFileName = "";
try {
doc = parser.parseFromString(reader.result, "application/xml");
fileUpload.value = "";
startApp(doc)
.then(function(data) {
handleAppStart(data)
})
.catch(handleError);
} catch (e) {
handleError(e);
}
}
function handleFileUpload(event) {
let file = fileUpload.files[0];
if (/xml/.test(file.type)) {
reader.readAsText(file);
currentFileName = file.name;
}
}
fileUpload.addEventListener("change", handleFileUpload)
<input type="file" name="fileupload" id="fileupload" accept=".xml" />
<label for="fileupload"></label>
Jeśli plik cookie nie może przechowywać wystarczającej ilości danych dla zamierzonego użycia, to może to zrobić z [pamięcią lokalną] (https://developer.mozilla.org/pl -US/docs/Web/API/Window/localStorage)? –
Obecnie wciąż nie jestem pewien, czego potrzebujesz, "załaduj xml/json w chrome bez funkcji przez wtyczkę lub coś innego?" Proszę opracować nieco więcej. –
Możliwy duplikat http://stackoverflow.com/questions/7949752/cross-browser-javascript-xml-parsing –