none
無法判斷上傳文檔的文件類型(ContentType 無效) RRS feed

  • 问题

  • 有一個頁面,客戶可以上傳txt文件和csv文件,但是不允許上傳其他的文件,就算把一個jpg文件改掉文件名為txt,也要職別出來,然後禁止上傳

    我用了三重判斷,關鍵代碼如下

     

    //獲取文件名稱的 Extension

    string extension = System.IO.Path.GetExtension(FileUpload1.FileName);

    //第一重判斷 ,根據Extension判斷

    if (extension != ".txt" && extension != ".csv")

    {

        Page.ClientScript.RegisterStartupScript(Page.GetType(), "noFile", "<script>alert(\"File  Extension is wrong\")</script> ");

        return;

    }

    //第二重判斷,根據 MIME

    if (FileUpload1.PostedFile.ContentType != "text/plain")

    {

        Page.ClientScript.RegisterStartupScript(Page.GetType(), "noFile", "<script>alert(\"File  Extension is wrong\")</script>");

        return;

    }

    try

    {

             Stream stream = FileUpload1.FileContent;

         StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8);

        

        System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(stream);

    byte buffer = binaryReader.ReadByte();

    string fileclass = buffer.ToString();

    buffer = binaryReader.ReadByte();

    fileclass += buffer.ToString();

    //第三重判斷 :專門針對csv判斷, 等于 117115 说明 csv类型(txt文件沒有文件頭,無法判斷,所以此處只判斷 csv)

    if (fileclass != "117115" && extension == ".csv")

    {

    Page.ClientScript.RegisterStartupScript(Page.GetType(), "noFile", "<script>alert(\"File  Extension is wrong\")</script>");

    return;

    }

    }

    現在我頭痛的問題是,我把一個.jpg圖片文件的擴展後綴改為.txt,服務器就被騙過去了。用ContentType 也識別不出來,也被騙了

    要怎麼做才能讓頁面不被騙過去呢?

    2012年2月15日 8:17

全部回复

  • 据我所知,如果在 windows 系统里面把扩展名改变了,就等于说把它的 ContentType 也同时改变了。就像如果你看到一个文本文件扩展名为 .txt 然后你双击它开的肯定是记事本啊,如果你对这个文本文件重命名为例如 test.htm 反正以 htm - 或者其他什么东西 - 作为扩展名则你再双击它可能就是使用 ie 打开了。。。所以使用 ContentType 是无法识别的。。。
    2012年2月23日 13:36
  • 2012年2月28日 0:31
    版主