【发布时间】:2019-05-04 11:52:00
【问题描述】:
我有一个 FileUpload 控件,我在其中上传 PDF 文件并将它们保存到文件夹中,文件路径保存到数据库中。
问题是当我上传包含括号 () 作为文件名一部分的文件时,它返回未定义。仅当文件名带有括号 () 时才会发生这种情况,如果文件名没有括号 () 则上传正常。
这是我的代码
var filePaths;
function UploadFile() {
var fileUpload = document.getElementById("fuPDFupload");
var regex = new RegExp("([a-zA-Z0-9\s_\\.\-:])+(.jpg|.png|.pdf)$");
if (regex.test(fileUpload.value.toLowerCase())) {
//Check whether HTML5 is supported.
if (typeof (fileUpload.files) != "undefined") {
//Initiate the FileReader object.
var reader = new FileReader();
//Read the contents of Image File.
reader.readAsDataURL(fileUpload.files[0]);
reader.onload = function (e) {
//Initiate the JavaScript Image object.
var image = new Image();
//Set the Base64 string return from FileReader as source.
image.src = e.target.result;
var fileUpload = $("#fuPDFupload").get(0);
var files = fileUpload.files;
var data = new FormData();
for (var i = 0; i < files.length; i++) {
data.append(files[i].name, files[i]);
}
$.ajax({
url: "FileUploadHandler.ashx",
type: "POST",
data: data,
contentType: false,
processData: false,
success: function (result) {
filePaths = result;
//Save to DB
UpdateSchedule();
},
error: function (err) {
}
});
return true;
};
} else {
alert("This browser does not support HTML5.");
return false;
}
} else {
return false;
}
}
FileUploadHandler 代码:
public class FileUploadHandler : IHttpHandler {
public void ProcessRequest(HttpContext context)
{
if (context.Request.Files.Count > 0)
{
string filePaths = Guid.NewGuid().ToString() + ".pdf";
HttpPostedFile file = context.Request.Files[0];
string path = context.Server.MapPath("~/QfrencyInvoices/" + filePaths);
file.SaveAs(path);
context.Response.ContentType = "text/plain";
context.Response.Write(filePaths);
}
}
public bool IsReusable {
get {
return false;
}
}
}
我认为问题可能是因为 Regex 表达式不正确,但我无法修复它。 请帮助我如何上传文件名中包含括号 () 的文件。谢谢。
【问题讨论】:
-
您是否尝试过修改正则表达式以包含括号?
-
我试过了,但没有成功。我不确定我是否正确构建了正则表达式
-
像这样转义:
\(和\),因为圆括号是正则表达式语法(分组)的一部分。但是:你为什么要这样做?一定有人首先想出了那个正则表达式,故意限制可以上传的内容。应该有一个要求/规则,否则整个测试没有意义。或者至少向用户返回一个有意义的消息,只是无缘无故地拒绝会让他们很困惑。防弹文件上传安全检查总是涉及文件字节签名测试,如 libmagic,文件名可以被欺骗。 -
文件(AND文件名)检查/修改必须在服务器端完成,否则可能会出现恶意代码注入。
标签: javascript c# regex ajax file-upload