假设我有一个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">
相同的结果
答案 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