【问题标题】:File uploaded does not upload if the file name has parenthesis ()如果文件名有括号(),文件上传不上传
【发布时间】: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


【解决方案1】:

留下下一个正则表达式new RegExp("(\.(jpg|png|pdf)$", "i");。它检查文件名是否具有扩展名 jpg、png 或 pdf。文本大小写无关紧要,因此添加了“i”作为第二个参数。

你可以在https://regexone.com/学习正则表达式

【讨论】:

  • 我应该按照您的建议更改正则表达式吗? new RegExp("(\.(jpg|png|pdf)$", "i");
  • 这对我来说很好用: var regex = new RegExp("\.+(.jpg|.png|.pdf)$");
猜你喜欢
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2020-02-17
  • 2017-11-19
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 2020-03-22
相关资源
最近更新 更多