验证上传文件的扩展名

5

上传文件运行良好,但现在我正在尝试验证文件扩展名,看起来有一些干扰在 FileUpload1FileUpload2 之间。

FileUpload1 用于上传 .jpg 或 .png 图像,FileUpload2 用于上传 .pdf 文件。

以下是在 BtnInsert_Click 事件上执行的代码:

protected void BtnInsert_Click(object sender, EventArgs e)
{
    string[] validPhotoFile = { ".jpg", ".png" };
    string validPDFFile = ".pdf";

    string photoExt = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName);
    string pdfExt = System.IO.Path.GetExtension(FileUpload2.PostedFile.FileName);

    bool isValidPhotoFile = false;
    bool isValidPDFFile = false;

    for (int i = 0; i < validPhotoFile.Length; i++)
    {
        if (photoExt == "." + validPhotoFile[i])
        {
            isValidPhotoFile = true;
            break;
        }
    }

    for (int i = 0; i < validPDFFile.Length; i++)
    {
        if (pdfExt == "." + validPDFFile[i])
        {
            isValidPDFFile = true;
            break;
        }
    }

    if (!isValidPhotoFile)
    {
        PhotoErrorMessage.Text = "Upload .jpg or .png image!";
    }

    if (!isValidPDFFile)
    {
        PDFErrorMessage.Text = "Upload .pdf file!";
    }

    else
    {
        string photoFilPath = Path.GetFileName(FileUpload1.PostedFile.FileName.ToString());
        string pdfFilPath = Path.GetFileName(FileUpload2.PostedFile.FileName.ToString());

        string photoPath = Server.MapPath(@"~/PDFCover/" + fotoFilPath);
        string pdfPath = Server.MapPath(@"~/PDF/" + pdfFilPath);

        FileUpload1.PostedFile.SaveAs(photoPath);
        FileUpload2.PostedFile.SaveAs(pdfPath);

        SqlCommand cmd = new SqlCommand("INSERT INTO Book(Title,Content...) VALUES ('" + TextBox1.Text
            + "','" + TextBox2.Text + ... + "','" + "~/PDFCover/" + photoFilPath
            + "','" + "~/PDF/" + pdfFilPath + "')", con);

        con.Open();
        cmd.ExecuteNonQuery();
        con.Close();
    }
}

现在,即使我选择上传有效的文件,它也会显示标签错误消息以上传有效的文件。

是的,同时上传这两个文件。在这种情况下,即图片和PDF文件。 - user2969489
1
扩展名不是验证文件类型的方法。如果我使用“.jpeg”,甚至根本没有扩展名怎么办?适当的方法,虽然在运行时更昂贵,但是解析文件是必要的。事实上,我经常发现需要解析上传到服务器的图像文件,以缩小它们的大小,例如在用户上传41兆像素文件作为个人资料图片的情况下。 - Kris Vandermotten
@Kris并不是很昂贵,因为jpg、png和pdf都有自己的文件头格式,可以让你在8到20个字节内识别文件。 - PTwr
@PTwr 太棒了!我从未想过这一点。感谢您的提示。 - Kris Vandermotten
可能是Determine file type of an image的重复问题。 - MikeSmithDev
显示剩余2条评论
2个回答

12
bool CheckFileType(string fileName)
{
    string ext = Path.GetExtension(fileName);
    switch (ext.ToLower())
    {
        case ".gif":
            return true;
        case ".jpg":
            return true;
        case ".jpeg":
            return true;
        case ".png":
            return true;
        default:
            return false;
    }
}

if (CheckFileType(fuImage.FileName))
{
 //..........
}

或使用 RegularExpressionValidator:

<asp:RegularExpressionValidator 
     ID="regexValidateImageFil" runat="server" ControlToValidate="fuImage" 
     ErrorMessage="file type not allow." 
     ValidationExpression="^([0-9a-zA-Z_\-~ :\\])+(.jpg|.JPG|.jpeg|.JPEG|.bmp|.BMP|.gif|.GIF|.png|.PNG)$"></asp:RegularExpressionValidator>

1
你能不能使用fallthrough并且摆脱前三个return true;语句呢? - David Klempfner

0

你是同时上传两个文件还是一个一个地上传?如果是一个一个地上传,那么其中一个值总是为false。

你还在validPhotoFile和validPDFFile前面加了一个句号,请将代码更改为以下内容。

for (int i = 0; i < validPhotoFile.Length; i++)
{
    if (photoExt == validPhotoFile[i]) // remove the period here it is already in your variables above
    {
        isValidPhotoFile = true;
        break;
    }
}

for (int i = 0; i < validPDFFile.Length; i++)
{
    if (pdfExt == validPDFFile[i]) // remove the period here it is already in your variables above
    {
        isValidPDFFile = true;
        break;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接