2009-08-19 83 views
0

我有一個asp.net應用程序,用戶可以將文件上傳到我們的數據庫。上傳文件時獲取不正確的文件擴展名和內容類型

有時他們上傳文件時,content-type設置爲"application/octet-stream"這是一個二進制文件。

當我問用戶,他們說他們上傳他們說這是一個.tif文件。不知何故上傳控件將其設置爲"application/octet-stream"

當我從我的電腦上傳相同的.tif文件時,它使用正確的內容類型(application/octet-stream)上傳。

我使用下面的代碼來獲取文件擴展名

fileExtension = filUpload.PostedFile.FileName.Substring(filUpload.PostedFile.FileName.LastIndexOf(".") + 1) 

有時它返回的文件擴展名是"c:\documen""j:\testing"等。我知道,Windows不允許在文件名中的特殊字符。

+1

首先,不推倒重來,用System.IO.Path.GetExtension得到擴展 – BlackTigerX 2009-08-19 17:53:40

+1

秒,你都在提「應用程序/八位字節流」既,正確和不正確的值 – BlackTigerX 2009-08-19 17:54:54

回答

3

您根本無法依靠瀏覽器提交可用的MIME媒體類型。客戶端機器可能沒有爲特定文件類型設置任何媒體類型信息(這可能是TIFF的情況),或者它可能根本不支持發送媒體類型,或者可能存在錯誤(因爲已經存在在過去與IE)。

你也不能依靠瀏覽器來提交可用的文件擴展名。客戶機可能不使用文件擴展名來確定文件的類型。 (事實上​​,Mac和現代Linux使用多種機制來確定類型,所以任何文件擴展名都可能是誤導性的,如果其中存在的話。)

對於這個問題,你甚至不能依靠瀏覽器來提交一個可用的文件名在第一位!並非每個操作系統都使用反斜槓字符和點來表示目錄和擴展分隔符;提交的文件名實際上是一個不透明的字符串,你可以用它來猜測一些常見的情況,但是你不能認爲是確定性的。

所以,唯一合理的方法來確定一個上傳的文件類型有:

  1. 向用戶明確他們上傳什麼類型。

  2. 嘗試猜測它可能來自媒體類型和尾隨文件名的類型,回退到詢問用戶它是什麼類型。

  3. 如果您想要允許的類型都是帶有可嗅探標頭的類型(如TIFF和大多數其他圖像格式),則可以通過查看文件的內容來計算出類型。

2

使用System.IO命名空間中的函數來解析它。

爲了得到擴展,你可以這樣做:

fileExtension = System.IO.Path.GetExtension(filUpload.PostedFile.FileName);
1

我認爲,用戶的瀏覽器和文件一起發出聲明MIME類型。然後由瀏覽器來聲明文件的類型。不同的瀏覽器可能具有不同的從文件推斷最佳MIME類型的能力。當你在服務器上獲取文件時,你可能只需檢查.tif [f]擴展名 - 這可能是上傳瀏覽器無論如何都會檢查的。

+0

問題是上傳的文件不需要是.tif文件。它可以是PDF,文字,文本文件等。 – Sridhar 2009-08-19 17:58:24

相關問題