3

私は自分のサイトのユーザーがXMLファイルをローカルマシンに保存し、後でHTMLファイル要素を使用してそれらをロードできるようにしようとしています。

iFrameで行ったことをファイルに保存します。

ユーザーにファイルをロードさせようとすると、常に例外が発生します。私はウェブ上で見つけることができるすべてのことを試しましたが、それを行う方法を見つけることができないようです。

クロスドメインやXMLHttpRequestがfile:/// C:/fakepath/Regions.xmlを読み込めないなど、あらゆる種類の例外が発生しています。クロスオリジンリクエストはHTTPでのみサポートされます。 私が試したコードによって異なります。

HTML5標準がURLを「fakepath」に置き換えていることを読みましたが、これに対する解決策が見つかりません。ユーザーが自分のコンピューターからファイルをロードして編集できるようにする方法はありませんか?サーバーから特定のファイルをロードすることは問題ではありませんが、ユーザーにこの自由を与え、ロードするファイルを決定せず、サーバーではなくコンピューターにxmlを保存してロードできるようにします

この問題の解決策はありますか?

このコードは見つかりましたが、どちらも役に立ちませんでした(そして私はこれの他のいくつかの検証を試しました):

1)

 var error = "";
                strFile = document.frmLoadFile.selectedFile.value;
                intPos = strFile.lastIndexOf("\\");
                strDirectory = strFile.substring(0, intPos);
                //alert(strDirectory);
                document.frmLoadFile.selectedFile.value = strDirectory;

                var file = 'file:\\\\\\' + document.frmLoadFile.selectedFile.value;
                try //Internet Explorer
                {
                    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                    xmlDoc.async = false;
                    xmlDoc.load(file);
                }
                catch (e) {
                    try //Firefox, Mozilla, Opera, etc.
                    {
                        xmlDoc = document.implementation.createDocument("", "", null);
                        xmlDoc.async = false;
                        xmlDoc.load(file);
                    }
                    catch (e) {
                        try //Google Chrome
                        {
                            var xmlhttp = new window.XMLHttpRequest();
                            xmlhttp.open("GET", file, false);
                            xmlhttp.send(null);
                            xmlDoc = xmlhttp.responseXML.documentElement;
                        }
                        catch (e) {
                            error = e.message;
                        }
                    }
                }

2)

var xmlDoc;
var xmlloaded = false;

function xml_initLibrary(file) {
importXML(file);
}

function importXML(xmlfile) {
try {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", xmlfile, false);
}
catch (Exception) {
    var ie = (typeof window.ActiveXObject != 'undefined');

    if (ie) {
        xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = false;
        while (xmlDoc.readyState != 4) { };
        xmlDoc.load(xmlfile);
        xmlloaded = true;
        readXML();
    }
    else {
        xmlDoc = document.implementation.createDocument("", "", null);
        xmlDoc.onload = readXML;
        xmlDoc.load(xmlfile);
        xmlloaded = true;
    }
}

if (!xmlloaded) {
    xmlhttp.setRequestHeader('Content-Type', 'text/xml')
    xmlhttp.send("");
    xmlDoc = xmlhttp.responseXML;
    xmlloaded = true;
    readXML();
}
}

function readXML() {
//console.log(xmlDoc);
}

これを修正する方法があるかどうか誰かが知っていますか?サーバーにファイルを保存する必要がありますか?

エレズさん、どうもありがとうございました

4

1 に答える 1

5

HTML5 の新しいFileReaderを探していると思います。IE < 10 の場合、 ActiveX FileSystemObjectを使用する必要があります。

このコードは Chrome で動作します。

<script type="text/javascript">
function doit(e) {
  var files = e.target.files;
  var reader = new FileReader();
  reader.onload = function() {
    var parsed = new DOMParser().parseFromString(this.result, "text/xml");
    console.log(parsed);
  };
  reader.readAsText(files[0]);
}

document.getElementById("selectfile").addEventListener("change", doit, false);​
</script>

<input type="file" id="selectfile" />

http://jsfiddle.net/xKuPV/

于 2013-01-03T21:48:18.273 に答える