在提交之前验证xml文件是否是带有javascript的文件

时间:2014-07-08 19:14:58

标签: javascript php html xml

假设我有一个xml文件,我想通过一个html表单使用php上传,但我想首先验证xml文件是一个使用javascript的实际文件。我有一个只有一个输入和这段javascript代码的表单:

function Validate(form) {
var _validFileExtensions = [".xml"];

var arrInputs = form.getElementsByTagName("input");
for (var i = 0; i < arrInputs.length; i++) {
    var oInput = arrInputs[i];
    if (oInput.type == "file") {
        var sFileName = oInput.value;
        if (sFileName.length > 0) {
            var blnValid = false;
            for (var j = 0; j < _validFileExtensions.length; j++) {
                var sCurExtension = _validFileExtensions[j];
                if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).toLowerCase() == sCurExtension.toLowerCase()) {
                    blnValid = true;
                    break;
                }
            }

            if (!blnValid) {
                alert(oInput.type);
                //alert("Lo siento, " + sFileName + " es invalido, la única extensión permitida es: " + _validFileExtensions.join(", "));
                return false;
            }
        }
    }else{
        alert(oInput.type);
        //alert("Tienes que seleccionar un archivo");
        return false;
    }
}

return false;
}

我只是用这篇文章来描述问题,即file.xml isn&#ta;文件是空的,如果我尝试提交我可以在我的计算机上找到的任何类型的文件,喜欢&#34; javascript.js&#34;,&#34; newdocument.txt&#34;或任何类型的文件,javascript&#34; file.type&#34;匹配&#34;文件&#34;,但如果我提交&#34; file.xml&#34;如果我点击提交而不选择任何文件,它会提醒&#34;提交&#34;同样的事情。这让我相信.xml文件被视为某种指令或其他东西。

我知道我还必须验证服务器端和内容,但是现在我想使用javascript验证客户端,所以,有没有办法验证&#34; file.xml&#34;是一个档案?

编辑:(添加完整代码和小提琴&gt;
HTML:

<!DOCTYPE html>
<html>
    <head>
        <meta content="text/html; charset=utf-8" http-equiv="content-type" />
        <title>XML a PDF</title>
        <script type="text/JavaScript" src="javita.js"></script>
    </head>
     <body>
            <form action="transforma.php" method="post"  mimetype="text/xml" enctype="text/xml" onsubmit="return Validate(this);" name="transforma">
            <label for="file">Filename: </label>
            <input type="file" name="file" id="file"><br>
            <input type="submit" name="submit" value="Submit">
        </form>
    </body>
</html>

还试过:

<form action="transforma.php" method="post"  enctype="multipart/form-data" onsubmit="return Validate(this);" name="transforma">

相同的结果

Fiddle

2 个答案:

答案 0 :(得分:1)

如果你还没有意识到,那么你只是完全按照你所做的假设找错了方向。

首先,javascript在字符串的内容上没有区别。它只是在一个字符串上运行。该字符串是包含"I hate you javascript, go home"还是"this-file-extension-is-better-than-others.txt"还是您的遗失"file.xml" - 它在此处始终有效。

两天前看到你的评论:

  

我更感兴趣的是知道为什么xml文件没有被javascript识别为文件,或者我如何完成javascript以确认xml文件为文件。

所以我告诉你:XML文件被javascript识别为文件。

在我向你介绍了这些知识之后(我希望你能够开心地接受这一点,因为它解决了你问题中最大的部分),然后让我们看看&#39;继续在这里。

首先,你要一次做太多事情。例如,您想获取文件输入元素。由于它没有ID,因此您可以遍历所有输入。这不是必要的。如果问题是该元素无法识别,请为表单提供一个ID,以便您可以:

form.id || (form.id = "id".concat(+new Date, parseInt(Math.random() * Math.pow(10, 16))));

var fileName = document.querySelector("#".concat(form.id, " input[type=file]")).value;

完成。有fileName的字符串。如果您再验证这一点,您可以很容易地看到它始终包含文件名。如果还没有选择,它是一个空字符串,如果选择,它就是&#34;伪路径&#34;文件名的字符串。至少在这一点上你必须意识到它总是一个字符串,无论你选择了哪个文件。

接下来就是你应该创建一个功能来验证文件名对白名单的扩展名。这样做的好处是,你可以在任何字符串上使用它,无论你从哪里获得它:

var fileExtension = function (file) {
    var extensions = [".xml"];
    var match;
    extensions.every(function (extension) {
        var e = /([.*+?^=!:${}()|\[\]\/\\])/g;
        if (new RegExp(extension.replace(e, "\\$1") + '$', 'i').test(file)) {
            match = extension;
            return false;
        }
        return true;
    });
    return match;
}

完成此操作后,您可以轻松验证表单,请参阅此工作小提琴:http://jsfiddle.net/JZj85/

答案 1 :(得分:0)

它并非完全万无一失,但你可以试试这个:

function validate(form) {
    var file = form.getElementsByTagName("input")[0];
    var ext = file.value.substring(file.value.lastIndexOf('.'));
    if (ext == "xml") {
        // Do something when it is an xml file
    } else {
        // Do something else when it is not
    }
    return false
}

.getElementsByTagName返回一个元素数组。你想要第一个,因为那是你的文件输入 var ext = ...获取扩展名,或者至少是最后一个.(包括)后面的扩展名。但是用户仍然可以上传另一个文件类型但只是更改扩展名,因此您还需要一些服务器端验证。

请参阅Fiddle