默认情况下,未启用在铬实例启动时file:使用铬XMLHttpRequest()或使用无--allow-file-access-from-files标记设置访问协议。默认情况下,file:// URIs无法读取其他file:// URI。这是对需要旧行为进行测试的开发人员的覆盖。
目前,由于安全策略,Chromium无法通过ajax读取本地文件--allow-file-access-from-files。但我目前需要创建一个Web应用程序,其中数据库是一个xml文件(在极端情况下为json),位于一个带有index.html的目录中。可以理解,用户可以在本地运行该应用程序。是否有解决xml-(json-)文件的解决方法,而不将其包装在函数中并更改为js扩展名?
如果用户知道应用程序将使用本地文件,则可以使用元素供用户从用户本地文件系统上载文件,使用处理文件FileReader,然后继续应用程序。
否则,建议用户使用应用程序需要启动带有--allow-file-access-from-files标志集的铬 ,这可以通过为此目的创建启动器来完成,为chrome实例指定不同的用户数据目录。例如,发射器可以是/usr/bin/chromium-browser --user-data-dir="/home/user/.config/chromium-temp" --allow-file-access-from-files
上面的命令也可以在 terminal$ /usr/bin/chromium-browser --user-data-dir="/home/user/.config/chromium-temp" --allow-file-access-from-files
没有创建桌面启动器; 当铬的实例关闭时$ rm -rf /home/user/.config/chromium-temp
删除chrome实例的配置文件夹。
设置标志后,用户可以包含带rel="import"属性的元素并href指向本地文件并type设置为"application/xml",XMLHttpRequest以获取除获取文件之外的选项。访问XML document使用const doc = document.querySelector("link[rel=import]").import;
另一个替代方案,即更多涉及,将requestFileSystem用于存储文件LocalFileSystem。
看到
或者创建或修改Chrome应用程序并使用chrome.fileSystem
最简单的方法是通过肯定的用户动作提供文件上传的手段; 处理上传的文件,然后继续申请。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)