1. 程式人生 > >mime type 與 dataflavor

mime type 與 dataflavor

多用途網際網路郵件擴充套件MIMEMultipurpose Internet Mail Extensions)是一個網際網路標準,它擴充套件了電子郵件標準,使其能夠支援非ASCII字元、二進位制格式附件等多種格式的郵件訊息。

內容型別(Content-Type),這個頭部領域用於指定訊息的型別。一般以下面的形式出現。

Content-Type: [type]/[subtype]; parameter

type有下面的形式。

  • Text:用於標準化地表示的文字資訊,文字訊息可以是多種字符集和或者多種格式的;
  • Multipart:用於連線訊息體的多個部分構成一個訊息,這些部分可以是不同型別的資料;
  • Application:用於傳輸應用程式資料或者二進位制資料;
  • Message:用於包裝一個E-mail訊息;
  • Image:用於傳輸靜態圖片資料;
  • Audio:用於傳輸音訊或者音聲資料;
  • Video:用於傳輸動態影像資料,可以是與音訊編輯在一起的視訊資料格式。

subtype用於指定type的詳細形式。content-type/subtype配對的集合和與此相關的引數,將隨著時間而增長。為了確保這些值在一個有序而且公開的狀態下開發,MIME使用Internet Assigned Numbers Authority (IANA)作為中心的註冊機制來管理這些值。常用的subtype值如下所示:

  • text/plain(
    純文字
  • text/html(HTML文件)
  • application/xhtml+xml(XHTML文件)
  • image/gif(GIF影象)
  • image/jpeg(JPEG影象)【PHP中為:image/pjpeg】
  • image/png(PNG影象)【PHP中為:image/x-png】
  • video/mpeg(MPEG動畫)
  • application/octet-stream(任意的二進位制資料)
  • application/pdf(PDF文件)
  • application/msword(Microsoft Word檔案)
  • application/vnd.wap.xhtml+xml (wap1.0+)
  • application/xhtml+xml (wap2.0+)
  • message/rfc822(RFC 822形式)
  • multipart/alternative(HTML郵件的HTML形式和純文字形式,相同內容使用不同形式表示)
  • application/x-www-form-urlencoded(使用HTTP的POST方法提交的表單)
  • multipart/form-data(同上,但主要用於表單提交時伴隨檔案上傳的場合)

此外,尚未被接受為正式資料型別的subtype,可以使用x-開始的獨立名稱(例如application/x-gzip)。vnd-開始的固有名稱也可以使用(例:application/vnd.ms-excel)。

parameter可以用來指定附加的資訊,更多情況下是用於指定text/plain和text/htm等的文字編碼方式的charset引數。MIME根據type制定了預設的subtype,當客戶端不能確定訊息的subtype的情況下,訊息被看作預設的subtype進行處理。Text預設是text/plain,Application預設是application/octet-stream而Multipart預設情況下被看作multipart/mixed。

DataFlavor 提供有關資料的元資訊。DataFlavor 通常用於訪問剪下板上的資料,或者在執行拖放操作時使用,封裝了MIME格式。

例如,imageFlavor 的 MIME 型別是 "image/x-java-image;class=java.awt.Image",基本型別是 image,子型別是 x-java-image,表示形式類是 java.awt.Image。當呼叫 getTransferData,且 DataFlavorimageFlavor 時,返回 java.awt.Image 的例項。要重點注意的是,DataFlavor 不會依據表示形式類進行任何錯誤檢查。由 DataFlavor 的使用者(如 Transferable)決定是否遵守表示形式類。 
此外,具有 "text" 基本 MIME 型別的 DataFlavor 例項可能有一個 "charset" 引數。有關 "text" MIME 型別和 "charset" 引數的詳細資訊,請參閱 RFC 2046selectBestTextFlavor(java.awt.datatransfer.DataFlavor[]) 。 

DataFlavors 的相等性由基本型別、子型別和表示形式類決定。有關詳細資訊,請參閱 equals(DataFlavor)。在確定相等性時,所有可選引數都被忽略。例如,以下程式碼產生的兩個 DataFlavors 被認為是相等的:

   DataFlavor flavor1 = new DataFlavor(Object.class, "X-test/test; class=<java.lang.Object>; foo=bar");
   DataFlavor flavor2 = new DataFlavor(Object.class, "X-test/test; class=<java.lang.Object>; x=y");
   // The following returns true.
   flavor1.equals(flavor2);
 
正如上面提到的那樣,flavor1flavor2 被認為是相等的。同樣地,請求 TransferableDataFlavor 將返回相同的結果。