2011年4月23日 星期六

[Web Service]-利用Eclipse及CXF2開發Web Service

準備工具
Eclipse IDE for Java EE Developer-目前版本Helios SR2
Tomcat-目前版本-7.0.12
Apache CXF2-目前版本2.4.0

開發環境配置
1.將下載的Eclipse、Tomcat及CXF2 zip檔解壓縮
2.執行Eclipse,點選Windows->Preferences->Web Services->CXF  2.x Preferences
   將CXF Runtime指向解壓縮後的CXFf2目錄,另外在Java2WS及WSDL2Java的tag中,
   也有一些屬性值可以加以設定,比如在Java2WS中我們就能設定是否要自動產生WSDL檔
3.在下方工作區點選Server tag,並在空白處按右鍵New->Server
    在這裡我們選擇Server類型-Apache Tomcat 7.0
按下一步,將目錄位置指向剛剛所解壓縮的Tomcat 7.0.12
按下確認後即可在Server區看到剛剛所新增的Tomcat Server


開發Web Service-Server端
1.新增一個Dynamic Web Project
2.新增一個EchoTest類別,裡面實作一個echo operation
3.在EchoTest類別上按右鍵選擇Web Service->Create Web Service
   在跳出的視窗中,Web Service Type這裡要選擇Button up,
   (Top down是指由WSDL來建立Web Service)
   另外Web service runtime這裡要選擇Apache CXF 2.x
按下確認後就會利用CXF套件幫我們產出Web Service的相關檔案了,連WSDL檔也一併產生
另外若當初有佈署Runtime Server的話,產生Web Service的同時也會將此Web Service佈署在此server中,如下圖在Tomcat Server下可以看到我們剛剛所產生的Web Service,按下server執行鈕即可運行該服務

開發Web Service-Client端
1.新增一個Java Project
2.在src按右鍵New->Other,在Web Services類別選擇Web Service Client
在跳出的視窗中點選Brower,在跳出視窗的上方URI欄位中輸入
http://localhost:8080/WSService/services/EchoTestPort?wsdl
這裡的WSDL位址在剛剛建立Web Service自動產出的WSDL文件中可以找到
按下確認後套件會自動找尋這份WSDL文件(注意:這裡Web Service所在的server必須啟動)
按下確認後回到前一個視窗,這裡的Web server runtime採用預設的Apache Axis就好
按下確認,套件會為我們自動產生Web Service Client的相關類別
3.我們新增一個EchoDemo類別來實際使用套件為我們產生的Web Service Client相關類別
4.直接執行,在client端就會利用套件為我們產生的Web Service Client相關類別來連接我們佈署在Tomcat Server上的Web Service,並帶回執行結果

2010年11月17日 星期三

[Android]-使用MapView與事件處理

要在Android開發上使用MapView首先要先申請一組apiKey
步驟如下:
1.開啟本機Dos模式,輸入以下指令
keytool -list -alias androiddebugkey -keystore "Android SDK的debug.keystore路徑" -storepass android  -keypass android
筆者本機的debug.keystore路徑為"C:\Users\User\.android\debug.keystore"
執行後可以得到一組認証指紋如下:

2.接著拿這組認証指紋去Google網站上申請apikey
申請網址:http://code.google.com/intl/zh-TW/android/maps-api-signup.html

3.在layout的xml檔中加入下列宣告
<LinearLayout android:id="@+id/LinearLayout05"
              android:layout_width="fill_parent" 
              android:layout_height="wrap_content">
    <com.google.android.maps.MapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:enabled="true"
        android:clickable="true"
        android:apiKey="0Ci0OUAEfhUnW3nH7qRHKWtFUzqQDqBhRfZ92Aw"/>
  </LinearLayout>
4.最後在AndroidManifest.xml設定檔中要加入使用權限及library的宣告:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="org.chung.product"
          android:versionCode="1"
          android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".SafeAlert"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".GPSLocation"/>
        <uses-library android:name="com.google.android.maps"/>
    </application>
    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
</manifest>

接下來介紹兩個常用的事件
1.第一個是座標改變時所觸發的事件
要完成這個功能會用到LocationManager及LocationHandler這兩個類別
範例碼如下:
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.location);

    MapView mapView = (MapView) findViewById(R.id.mapview);
        
    LocationManager mLocationManager = (LocationManager)          
                            getSystemService(Context.LOCATION_SERVICE);
    LocationHandler locationHandler = new LocationHandler();

    // 設定MapView可以縮放
    mapView.setBuiltInZoomControls(true);

    // 設定Zoom大小和地圖的中心點
    MapController mc = mapView.getController();
    mc.setZoom(INITIAL_ZOOM_LEVEL);
    mc.setCenter(new GeoPoint(INITIAL_LATITUDE, INITIAL_LONGITUDE));

    // 位置有變化時,登錄呼叫的方法
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
    0, 0, locationHandler);
}

public class LocationHandler implements LocationListener {
    // 位置有變化時,呼叫此method
    public void onLocationChanged(Location location) {
        GeoPoint gp = new GeoPoint((int) (location.getLatitude() * 1E6),
                                       (int) (location.getLongitude() * 1E6));
        Log.i(TAG,"Location Changed: " + gp.toString());
   
        mc.animateTo(gp);
    }

    public void onProviderDisabled(String provider) {
        // TODO
    }

    public void onProviderEnabled(String provider) {
        // TODO 
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO
    }
}
2.第二個是滑動MAP時所觸發的事件
下面的範例利用ItemizedOverlay在地圖貼上地標,並在滑動map時
持續把地標更新在地圖中央。
首先自訂一個類並繼承ItemizedOverlay
這裡最重要的觀念是,mapview上所觸發的事件,會先pass到overlay,
所以對於map上的事件行為要在overlay中實作。
public class MapItemizedOverlay extends ItemizedOverlay {
    private ArrayList mOverlays = new ArrayList();

    public MapItemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
    }

    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }

    @Override
    protected OverlayItem createItem(int i) {
        return mOverlays.get(i);
    }

    @Override
    public int size() {
        return mOverlays.size();
    }

    // 在mapview上偵測到的touch event會先pass到overlay來
    @Override
    public boolean onTouchEvent(MotionEvent event, MapView v) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            // 清除舊的marker並貼上新的
            mapView.getOverlays().remove(0);
            OverlayItem overlayitem = new OverlayItem(
                           mapView.getMapCenter(), "", "");
            Drawable drawable = this.getResources().getDrawable(R.drawable.icon);
            itemizedOverlay = new MapItemizedOverlay(drawable);
            itemizedOverlay.addOverlay(overlayitem);
            mapView.getOverlays().add(itemizedOverlay);
        }
        return super.onTouchEvent(event, v);
    }
}
下面是執行結果畫面,隨著map的拖動,地標會隨時保持在地圖中央:

2010年10月9日 星期六

[PHP]-Open Flash Chart2

接下來介紹好用的php chart圖工具open flash chart2,
這個函式庫同時也支援其它語言如Ruby, Perl, Python, .NET and Java等。

首先下載open flash chart2的函式庫壓縮檔:
Open Flash Chart Version 2 Lug Wyrm Charmer

解壓縮後將目錄內的open-flash-chart.swf檔及js、php-ofc-library兩個
目錄copy到網站根目錄下。

要在html中顯示chart圖有兩個步驟:
1.在head標韱中加入這兩個javascript
<script type="text/javascript" src="js/swfobject.js"></script>
<script type="text/javascript">
   swfobject.embedSWF("open-flash-chart.swf", "my_chart", "500", "500", "9.0.0");
</script>
2.利用div指定與swfobject相同參數名稱的id來擺放chart圖位置
<div id="my_chart">

上述動作只是準備好chart圖的位置而已,
接下來要透個php產生json格式資料檔做為chart圖的資料來源,
(也能另外準備純json格式的檔案透過網址傳遞給chart)
下面是以radar圖為例:
<?php
    // prepare radar chart
    include 'php-ofc-library/open-flash-chart.php';
    include 'php-ofc-library/ofc_sugar.php';

    $chart = new open_flash_chart();

    $area = new area();
    // set the circle line width:
    $area->set_width( 1 );
    $area->set_default_dot_style( new s_hollow_dot('#45909F', 5) );
    $area->set_colour( '#45909F' );
    $area->set_fill_colour( '#45909F' );
    $area->set_fill_alpha( 0.4 );
    $area->set_loop();
    $area->set_values(array(8,3,6,3.4,7));

    // add the area object to the chart:
    $chart->add_element($area);

    $r = new radar_axis(10);
    $r->set_colour( '#EFD1EF' );
    $r->set_grid_colour( '#EFD1EF' );

    $labels = new radar_axis_labels( 
              array('0','1','2','3','4','5','6','7','8','9','10') );
    $labels->set_colour( '#9F819F' );
    $r->set_labels( $labels );

    $spoke_labels = new radar_spoke_labels(
        array(
            '1.外部環境品質',
            '2.內部環境品質',
            '3.服務作業SOP',
            '4.人員服務態度',
            '5.附加價值與設備') );

    $spoke_labels->set_colour( '#9F819F' );
    $r->set_spoke_labels( $spoke_labels );

    $chart->set_radar_axis( $r );

    $tooltip = new tooltip();
    $tooltip->set_proximity();
    $chart->set_tooltip( $tooltip );

    $chart->set_bg_colour( '#DFFFEC' );
?>

產生好的chart資料就存放在chart物件中,在官網中有說明其它傳遞json資料到
chart圖的方式,這裡我們是利用文件最後提及的利用javascript的方式來來傳遞,
要利用javascript傳遞藉由php所產生的json資料,必須在head標韱中另外加入
兩個javascript:
<script type="text/javascript" src="js/json/json2.js"></script>
<script type="text/javascript">
    function ofc_ready()
    {
        alert('ofc_ready');
    }

    function open_flash_chart_data()
    {
        alert( 'reading data' );
        return JSON.stringify(data);
    }

    function findSWF(movieName) {
        if (navigator.appName.indexOf("Microsoft")!= -1) {
            return window[movieName];
        } else {
            return document[movieName];
        }
    }
    // JSON資料在這裡傳遞
    var data = toPrettyString(); ?>;

</script>

最後是產生的chart圖:

官方參考文件:Open Flash Chart2

[PHP]-自製換頁

要做換頁功能時,要先準備好一些變數,
才能正確的擷取目前的資料範圍。
假設使用sqlite資料庫,程式碼如下:
    $dbh = new PDO('sqlite:question.db');
    // 取得資料總筆數
    $rs = null;
    $num = null;
    $sth0 = $dbh->query("SELECT count(*) FROM questions");
    $rs = $sth0->fetch();
    $num = $rs[0];
    //echo $num;

    // 一頁顯示20筆資料
    $page_size = 20;
    // 總頁數(無條件進位)
    $page_count = ceil($num/$page_size);

    // 目前所在頁數($_GET['anchor']為使用者點擊所要前往的頁數)
    $page_index = 0;
    if ($_GET['anchor']) {
        $page_index = $_GET['anchor'];
    } else {
        $page_index = 1;
    }

    // 目前頁面起始資料編號
    $item_start = 0;
    if ($page_index == 1) {
        $item_start = 1;
    } else {
        $item_start = ($page_index-1)*$page_size+1;
    }

    // 目前頁面最後資料編號
    $item_end = $page_index*$page_size;
    if ($item_end > $num) {
        $item_end = $num;
    }

    // page bar 起始頁(根據page_index座落在那個區間來判斷)
    // 這裡設定page bar一次能顯示十個頁面的連結
    $page_start = 0;
    $start = 1;
    $end = 10;
    $count = 1;
    for ($count; $count<=ceil($page_count/10); $count++) {
        if ($page_index>=$start && $page_index<=$end) {
            $page_start = $start;
            break;
        } else {
            $start = $start + 10;
            $end = $end + 10;
        }
    }

    // page bar 最後頁
    $page_end = 0;
    if ($page_start+9 < $page_count) {
        $page_end = $page_start+9;
    } else {
        $page_end = $page_count;
    }

    // 根據目前頁面的資料範圍擷取範圍內資料
    $result = null;
    $sth1 = $dbh->prepare("SELECT * FROM questions 
                      WHERE id >= ".$item_start." AND id <= ".$item_end);
    $sth1->execute();
    $result = $sth1->fetchAll();
這裡是假設資料表的id欄位是從1開始的連續編號,如果不是的話,
上述根據頁面資料範圍擷取資料庫範圍內資料的方法則不適用。

再來概據選取頁面,在html中印出目前的page bar範圍:
<div>
  <?php
    if ($page_count > 0) {
      if ($page_start != 1) {
  ?>
  <a href="./list.php?anchor=>?php echo $page_start-1; ?>">上10頁</a>
  <?php
      }
      for ($page_start; $page_start<=$page_end; $page_start++) {
        if ($page_start == $page_index) {
          echo $page_start;
        } else {
  ?>
  <a href="./list.php?anchor=<?php echo $page_start; ?>"></a>
  <?php
        }
      }
      if ($page_end<$page_count) {
  ?>
  <a href="./list.php?anchor=<?php echo $page_end+1; ?>">下10頁</a>
  <?php
      }
    }
  ?>
</div>

下頁是實際頁面:

2010年10月8日 星期五

[Android]-在Eclipse上部署Android開發環境

首先至eclipse官網下載eclipse
網址:http://www.eclipse.org/downloads/

接著至Android官網下載Android SDK
網址:http://developer.android.com/sdk/index.html
將SDK解壓縮到硬碟某位處(這裡筆者是置於D槽下)

再來要在eclipse安裝android develop plugin,
開啟eclipse,選取help->install new software...
於左上角add更新網址:https://dl-ssl.google.com/android/eclipse/
按下ok後會看到可下載元件,全部選取後並下載,下載後重新啟動eclipse。

接著還需要三個步驟才能建立Android Project
1.點選Window->Preference,選取Android,於SDK欄位中選取剛剛下載的
   SDK解壓縮目錄路徑。

2.點選Window->Android SDK and AVD Manager,選取Installed Packages,
   點選Update All,選擇最新版的Android SDK Platform並下載,這個動作是
   為了等會建立Android Project時能有Android模擬器target可以選取。
3,最後要新增一個virtual device,點選Window->Android SDK and AVD Manager,
選取Virtual Devices,新增一個virtual device,目前較穩定的版本為API Level7。

接著就可以建立Android Poject了

直接執行專案就會出現模擬器的結果

2010年10月7日 星期四

[PHP]-將db資料匯出成excel檔下載

範例程式碼如下:
$dbh = new PDO('sqlite:question.db');
// 取得資料總數
$rs = null;
$sth = $dbh->query("SELECT * FROM questions");
$rs = $sth->fetchAll();

if ($rs != null) {
    header("Content-type:application/vnd.ms-excel");
    header("Content-Disposition:filename=excel.xls");
    foreach ($rs as $value) {
        $content.=$value['field1']."\t".$value['field2']."\t".$value['field3']."\n";
    }
    echo $content;
}
第一個重點是利用header("Content-type:application/vnd.ms-excel")告知瀏覽器內文是
excel格式
第二個重點是利用header("Content-Disposition:filename=excel.xls")告知用戶端(Browser)
強制下載檔案,並使用filename屬性指定下載檔名。
其中利用\t來區隔每個欄位,其實就是csv格式。

執行時的畫面如下:


另外excel無法識別utf-8格式的中文,可以利用iconv("utf-8","big5", $value['field'])函式,
來將編碼從utf-8轉為big5輸出

最後整理一下Content Type大全:
.* = application/octet-stream
.001 = application/x-001
.301 = application/x-301
.323 = text/h323
.906 = application/x-906
.907 = drawing/907
.a11 = application/x-a11
.acp = audio/x-mei-aac
.ai = application/postscript
.aif = audio/aiff
.aifc = audio/aiff
.aiff = audio/aiff
.anv = application/x-anv
.asa = text/asa
.asf = video/x-ms-asf
.asp = text/asp
.asx = video/x-ms-asf
.au = audio/basic
.avi = video/avi
.awf = application/vnd.adobe.workflow
.biz = text/xml
.bmp = application/x-bmp
.bot = application/x-bot
.c4t = application/x-c4t
.c90 = application/x-c90
.cal = application/x-cals
.cat = application/vnd.ms-pki.seccat
.cdf = application/x-netcdf
.cdr = application/x-cdr
.cel = application/x-cel
.cer = application/x-x509-ca-cert
.cg4 = application/x-g4
.cgm = application/x-cgm
.cit = application/x-cit
.class = java/*
.cml = text/xml
.cmp = application/x-cmp
.cmx = application/x-cmx
.cot = application/x-cot
.crl = application/pkix-crl
.crt = application/x-x509-ca-cert
.csi = application/x-csi
.css = text/css
.cut = application/x-cut
.dbf = application/x-dbf
.dbm = application/x-dbm
.dbx = application/x-dbx
.dcd = text/xml
.dcx = application/x-dcx
.der = application/x-x509-ca-cert
.dgn = application/x-dgn
.dib = application/x-dib
.dll = application/x-msdownload
.doc = application/msword
.dot = application/msword
.drw = application/x-drw
.dtd = text/xml
.dwf = Model/vnd.dwf
.dwf = application/x-dwf
.dwg = application/x-dwg
.dxb = application/x-dxb
.dxf = application/x-dxf
.edn = application/vnd.adobe.edn
.emf = application/x-emf
.eml = message/rfc822
.ent = text/xml
.epi = application/x-epi
.eps = application/x-ps
.eps = application/postscript
.etd = application/x-ebx
.exe = application/x-msdownload
.fax = image/fax
.fdf = application/vnd.fdf
.fif = application/fractals
.fo = text/xml
.frm = application/x-frm
.g4 = application/x-g4
.gbr = application/x-gbr
.gcd = application/x-gcd
.gif = image/gif
.gl2 = application/x-gl2
.gp4 = application/x-gp4
.hgl = application/x-hgl
.hmr = application/x-hmr
.hpg = application/x-hpgl
.hpl = application/x-hpl
.hqx = application/mac-binhex40
.hrf = application/x-hrf
.hta = application/hta
.htc = text/x-component
.htm = text/html
.html = text/html
.htt = text/webviewhtml
.htx = text/html
.icb = application/x-icb
.ico = image/x-icon
.ico = application/x-ico
.iff = application/x-iff
.ig4 = application/x-g4
.igs = application/x-igs
.iii = application/x-iphone
.img = application/x-img
.ins = application/x-internet-signup
.isp = application/x-internet-signup
.IVF = video/x-ivf
.java = java/*
.jfif = image/jpeg
.jpe = image/jpeg
.jpe = application/x-jpe
.jpeg = image/jpeg
.jpg = image/jpeg
.jpg = application/x-jpg
.js = application/x-javascript
.jsp = text/html
.la1 = audio/x-liquid-file
.lar = application/x-laplayer-reg
.latex = application/x-latex
.lavs = audio/x-liquid-secure
.lbm = application/x-lbm
.lmsff = audio/x-la-lms
.ls = application/x-javascript
.ltr = application/x-ltr
.m1v = video/x-mpeg
.m2v = video/x-mpeg
.m3u = audio/mpegurl
.m4e = video/mpeg4
.mac = application/x-mac
.man = application/x-troff-man
.math = text/xml
.mdb = application/msaccess
.mdb = application/x-mdb
.mfp = application/x-shockwave-flash
.mht = message/rfc822
.mhtml = message/rfc822
.mi = application/x-mi
.mid = audio/mid
.midi = audio/mid
.mil = application/x-mil
.mml = text/xml
.mnd = audio/x-musicnet-download
.mns = audio/x-musicnet-stream
.mocha = application/x-javascript
.movie = video/x-sgi-movie
.mp1 = audio/mp1
.mp2 = audio/mp2
.mp2v = video/mpeg
.mp3 = audio/mp3
.mp4 = video/mpeg4
.mpa = video/x-mpg
.mpd = application/vnd.ms-project
.mpe = video/x-mpeg
.mpeg = video/mpg
.mpg = video/mpg
.mpga = audio/rn-mpeg
.mpp = application/vnd.ms-project
.mps = video/x-mpeg
.mpt = application/vnd.ms-project
.mpv = video/mpg
.mpv2 = video/mpeg
.mpw = application/vnd.ms-project
.mpx = application/vnd.ms-project
.mtx = text/xml
.mxp = application/x-mmxp
.net = image/pnetvue
.nrf = application/x-nrf
.nws = message/rfc822
.odc = text/x-ms-odc
.out = application/x-out
.p10 = application/pkcs10
.p12 = application/x-pkcs12
.p7b = application/x-pkcs7-certificates
.p7c = application/pkcs7-mime
.p7m = application/pkcs7-mime
.p7r = application/x-pkcs7-certreqresp
.p7s = application/pkcs7-signature
.pc5 = application/x-pc5
.pci = application/x-pci
.pcl = application/x-pcl
.pcx = application/x-pcx
.pdf = application/pdf
.pdf = application/pdf
.pdx = application/vnd.adobe.pdx
.pfx = application/x-pkcs12
.pgl = application/x-pgl
.pic = application/x-pic
.pko = application/vnd.ms-pki.pko
.pl = application/x-perl
.plg = text/html
.pls = audio/scpls
.plt = application/x-plt
.png = image/png
.png = application/x-png
.pot = application/vnd.ms-powerpoint
.ppa = application/vnd.ms-powerpoint
.ppm = application/x-ppm
.pps = application/vnd.ms-powerpoint
.ppt = application/vnd.ms-powerpoint
.ppt = application/x-ppt
.pr = application/x-pr
.prf = application/pics-rules
.prn = application/x-prn
.prt = application/x-prt
.ps = application/x-ps
.ps = application/postscript
.ptn = application/x-ptn
.pwz = application/vnd.ms-powerpoint
.r3t = text/vnd.rn-realtext3d
.ra = audio/vnd.rn-realaudio
.ram = audio/x-pn-realaudio
.ras = application/x-ras
.rat = application/rat-file
.rdf = text/xml
.rec = application/vnd.rn-recording
.red = application/x-red
.rgb = application/x-rgb
.rjs = application/vnd.rn-realsystem-rjs
.rjt = application/vnd.rn-realsystem-rjt
.rlc = application/x-rlc
.rle = application/x-rle
.rm = application/vnd.rn-realmedia
.rmf = application/vnd.adobe.rmf
.rmi = audio/mid
.rmj = application/vnd.rn-realsystem-rmj
.rmm = audio/x-pn-realaudio
.rmp = application/vnd.rn-rn_music_package
.rms = application/vnd.rn-realmedia-secure
.rmvb = application/vnd.rn-realmedia-vbr
.rmx = application/vnd.rn-realsystem-rmx
.rnx = application/vnd.rn-realplayer
.rp = image/vnd.rn-realpix
.rpm = audio/x-pn-realaudio-plugin
.rsml = application/vnd.rn-rsml
.rt = text/vnd.rn-realtext
.rtf = application/msword
.rtf = application/x-rtf
.rv = video/vnd.rn-realvideo
.sam = application/x-sam
.sat = application/x-sat
.sdp = application/sdp
.sdw = application/x-sdw
.sit = application/x-stuffit
.slb = application/x-slb
.sld = application/x-sld
.slk = drawing/x-slk
.smi = application/smil
.smil = application/smil
.smk = application/x-smk
.snd = audio/basic
.sol = text/plain
.sor = text/plain
.spc = application/x-pkcs7-certificates
.spl = application/futuresplash
.spp = text/xml
.ssm = application/streamingmedia
.sst = application/vnd.ms-pki.certstore
.stl = application/vnd.ms-pki.stl
.stm = text/html
.sty = application/x-sty
.svg = text/xml
.swf = application/x-shockwave-flash
.tdf = application/x-tdf
.tg4 = application/x-tg4
.tga = application/x-tga
.tif = image/tiff
.tif = application/x-tif
.tiff = image/tiff
.tld = text/xml
.top = drawing/x-top
.torrent = application/x-bittorrent
.tsd = text/xml
.txt = text/plain
.uin = application/x-icq
.uls = text/iuls
.vcf = text/x-vcard
.vda = application/x-vda
.vdx = application/vnd.visio
.vml = text/xml
.vpg = application/x-vpeg005
.vsd = application/vnd.visio
.vsd = application/x-vsd
.vss = application/vnd.visio
.vst = application/vnd.visio
.vst = application/x-vst
.vsw = application/vnd.visio
.vsx = application/vnd.visio
.vtx = application/vnd.visio
.vxml = text/xml
.wav = audio/wav
.wax = audio/x-ms-wax
.wb1 = application/x-wb1
.wb2 = application/x-wb2
.wb3 = application/x-wb3
.wbmp = image/vnd.wap.wbmp
.wiz = application/msword
.wk3 = application/x-wk3
.wk4 = application/x-wk4
.wkq = application/x-wkq
.wks = application/x-wks
.wm = video/x-ms-wm
.wma = audio/x-ms-wma
.wmd = application/x-ms-wmd
.wmf = application/x-wmf
.wml = text/vnd.wap.wml
.wmv = video/x-ms-wmv
.wmx = video/x-ms-wmx
.wmz = application/x-ms-wmz
.wp6 = application/x-wp6
.wpd = application/x-wpd
.wpg = application/x-wpg
.wpl = application/vnd.ms-wpl
.wq1 = application/x-wq1
.wr1 = application/x-wr1
.wri = application/x-wri
.wrk = application/x-wrk
.ws = application/x-ws
.ws2 = application/x-ws
.wsc = text/scriptlet
.wsdl = text/xml
.wvx = video/x-ms-wvx
.xdp = application/vnd.adobe.xdp
.xdr = text/xml
.xfd = application/vnd.adobe.xfd
.xfdf = application/vnd.adobe.xfdf
.xhtml = text/html
.xls = application/vnd.ms-excel
.xls = application/x-xls
.xlw = application/x-xlw
.xml = text/xml
.xpl = audio/scpls
.xq = text/xml
.xql = text/xml
.xquery = text/xml
.xsd = text/xml
.xsl = text/xml
.xslt = text/xml
.xwd = application/x-xwd
.x_b = application/x-x_b
.x_t = application/x-x_t