2010-03-14 62 views
3

如何在不使用文件擴展名前檢查文件類型(如jpg等格式)上傳與asp.net & c#?如何在將文件上傳到asp.net之前檢查文件類型?

我使用VS 2008 + asp.net + C#+ Telerik控制(RadUpload)


想象,一些機構更改文本文件擴展名JPG,並在上傳conrol選擇它如radupload。 ..

我們怎樣才能認識到這個文件是真正的jpg或不?

+0

爲什麼這個問題有> 1K的看法!?笑 – Nathan 2011-05-15 13:57:44

回答

1

例子:

// generate new Guid 
Guid fileguid = Guid.NewGuid(); 

// set limit for images, 1920x1200 pixels 
int imageWidth = 1920; 
int imageHeight = 1200; 
int maxFileSize = 8388608; 
// web.config - httpRuntime - maxRequestLength="8192" 
// 8,388,608 Bytes 
// 8,192 KB (/ 1024) 
// 8.00 MB (/ 1024/1024) 

string sConn = ConfigurationManager.ConnectionStrings["AssetsDBCS"].ConnectionString; 
SqlConnection objConn = new SqlConnection(sConn); 
objConn.Open(); 
SqlCommand objCmd = new SqlCommand("sp_FileStorage_New", objConn); 
objCmd.CommandType = CommandType.StoredProcedure; 

SqlParameter paramFileGuid = objCmd.Parameters.Add("@FileGuid", SqlDbType.UniqueIdentifier); 
SqlParameter paramFileSubject = objCmd.Parameters.Add("@Subject", SqlDbType.VarChar); 
SqlParameter paramFileContentType = objCmd.Parameters.Add("@ContentType", SqlDbType.VarChar); 
SqlParameter paramFileData = objCmd.Parameters.Add("@BinaryData", SqlDbType.VarBinary); 
SqlParameter paramFileSize = objCmd.Parameters.Add("@Filesize", SqlDbType.BigInt); 
SqlParameter paramFileDesc = objCmd.Parameters.Add("@Description", SqlDbType.VarChar); 
SqlParameter paramIsSLAFile = objCmd.Parameters.Add("@IsSLAFile", SqlDbType.Bit); 
SqlParameter paramUserStamp = objCmd.Parameters.Add("@UserStamp", SqlDbType.VarChar); 

paramFileGuid.Direction = ParameterDirection.Input; 
paramFileSubject.Direction = ParameterDirection.Input; 
paramFileContentType.Direction = ParameterDirection.Input; 
paramFileData.Direction = ParameterDirection.Input; 
paramFileSize.Direction = ParameterDirection.Input; 
paramFileDesc.Direction = ParameterDirection.Input; 
paramIsSLAFile.Direction = ParameterDirection.Input; 
paramUserStamp.Direction = ParameterDirection.Input; 

// read data 
byte[] bData = new byte[fuOne.PostedFile.ContentLength]; 
Stream objStream = fuOne.PostedFile.InputStream; 
objStream.Read(bData, 0, fuOne.PostedFile.ContentLength); 

paramFileSubject.Value = txtSubject.Text; 

objCmd.Parameters.Add("@FileName", SqlDbType.VarChar).Value = Path.GetFileName(fuOne.PostedFile.FileName); 
objCmd.Parameters.Add("@Extension", SqlDbType.VarChar).Value = Path.GetExtension(fuOne.PostedFile.FileName); 

paramFileGuid.Value = fileguid; 

paramFileContentType.Value = fuOne.PostedFile.ContentType; 
paramFileData.Value = bData; 
paramFileSize.Value = fuOne.PostedFile.ContentLength; 
paramFileDesc.Value = fuOne.PostedFile.FileName; 
paramIsSLAFile.Value = cbIsSLAFile.Checked; 
paramUserStamp.Value = ac.getUser(); 

if (fuOne.PostedFile.ContentLength < maxFileSize) 
{ 

    switch (fuOne.PostedFile.ContentType) 
    { 
     case "image/pjpeg": 
      { 

       System.Drawing.Image iImage = System.Drawing.Image.FromStream(new MemoryStream(bData)); 

       if (iImage.Width > imageWidth || iImage.Height > imageHeight) 
       { 
        lblStatus.Text = "The image width or height cannot be greater than " + imageHeight + " x " + imageWidth + " pixels"; 
       } 
       else 
       { 
        objCmd.ExecuteNonQuery(); 
        objConn.Close(); 

        hlDownload.Visible = true; 
        hlDownload.NavigateUrl = "Download.aspx?DownloadFileGuid=" + fileguid.ToString(); 
        hlDownload.Text = "Click here to download the uploaded file"; 

        hlShowFile.Visible = true; 
        hlShowFile.NavigateUrl = "Download.aspx?ShowFileGuid=" + fileguid.ToString(); 
        hlShowFile.Text = "Click here to view the uploaded file"; 

        lblStatus.Text = showUploadFileInfo(Path.GetFileName(fuOne.PostedFile.FileName), fuOne.PostedFile.ContentType, fuOne.PostedFile.ContentLength, iImage.Width, iImage.Height); 
       } 
       break; 
      } 
    } 
} 
+0

(真的真的非常感謝) (你的代碼是關於文件上傳和我RadUpload測試的contentType ...) (但這樣做,當u更改文本文件擴展名JPG所以RadUpload想到的是將contentType文件是「圖像/ pjpeg」)(我測試) (所以我認爲這個問題存在於fileupload ...) (你可以解釋一下我們!) – MoonLight 2010-03-14 17:24:40

2

上傳之前,您唯一要做的就是名稱。所以你不能。 你可以上傳它,檢查文件的內容,如果它不是你想要的,刪除它。

2

Telerik的允許你做使用「AllowedFileExtensions」屬性的客戶端驗證:

<telerik:RadUpload ID="RadUpload1" 
       runat="server" 
       InitialFileInputsCount="1" 
       AllowedFileExtensions=".zip,.jpg,.jpeg" 
      /> 

但是除了服務器端,您可以不檢查內容類型的文件。

邁克爾

0

您不能檢查不運行的客戶端應用,如Java小程序,閃光...等之前上傳的文件。這就是大多數圖像託管/編輯網站(如ShutteryFly等)使用對您的文件系統具有許可權的瀏覽器插件的原因。

2

您不應該依賴文件擴展名來確定文件的內容。請記住,擴展名可以重新命名爲任何內容。

確定文件類型的唯一方法是查看文件本身。你不能在客戶端輕鬆做到這一點。您必須允許將文件上傳到隔離目錄,然後在將文件移動到其最終受信任位置之前,在服務器上的該目錄中檢查該文件。

在任何情況下,您都應該對這些文件進行病毒掃描。

相關問題