2014-09-12 255 views
0

上传文件的工作正常,但现在我试图验证文件扩展名,看起来像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(); 
    } 
} 

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

+0

是在同一时间这两个文件。在这种情况下,图像和PDF文件。 – user2969489 2014-09-12 11:31:10

+1

扩展不是验证文件类型的方法。如果我使用“.jpeg”,甚至根本没有扩展,该怎么办?尽管在运行时更加昂贵,但正确的方法是解析文件。事实上,我经常发现需要解析上传到服务器的图像文件,以便缩小它们,例如,如果用户上传4100万像素文件以获取个人资料图片。 – 2014-09-12 11:31:21

+0

@Kris是不是很贵,因为JPG,PNG和PDF有自己的文件头格式,它可以让你识别8到20字节的文件。 – PTwr 2014-09-12 11:33:56

回答

0
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> 
0

你是同时上传两个文件,还是一次只上传一个文件?如果它一次只有一个,那么其中一个值总是会是假的。

您还在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; 
    } 
}