2014-09-12 254 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; 
    } 
}