1. androidN 开始,禁止使用file://开头Uri,要求使用Fileprovider 提供的Uri,该使用方法较多,就不一一列举,给出谷歌官方API使用地址。
FileProvider API使用介绍:
https://developer.android.com/reference/android/support/v4/content/FileProvider.html
文件共享谷歌官方Tranning
https://developer.android.com/training/secure-file-sharing/setup-sharing.html
2. 关于文件共享发送方按照如上配置即可,但是在第三方应用接受到共享的Intent数据时,怎么处理?
通过Intent获取content Uri,根据该Uri可以查询数据库。
注意; 查询只有两个列值 OpenableColumns.DISPLAY_NAME ,OpenableColumns.SIZE
当然,你还可以通过 ContentResolver().getType(uri);获取文件mimType。
上代码:
// 该方法主要是在接受到分享的Intent后处理,并获取文件
public void handleUriMethod(Intent intent){
if(intent == null){
return;
}
uri = (Uri)intent.getData();
mimeType = intent.getType();
if(uri==null){
Log.d("xuehao"," handleUriMethod.... uri ==null");
uri = (Uri)intent.getParcelableExtra(Intent.EXTRA_STREAM);
}
Log.d("xuehao"," handleUriMethod.... uri ="+uri );
ContentResolver cr = getContentResolver();
Cursor cur =null;
if(cr!=null && uri!=null){
cur =cr.query(uri, null, null, null, null);
}
int count = 0;
File file;
if(cur!=null){
Log.d("xuehao"," handleUriMethod.... mimeType ="+mimeType +" au="+uri.getAuthority());
count = cur.getCount();
int nameIndex = cur.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = cur.getColumnIndex(OpenableColumns.SIZE);
int colCount = cur.getColumnCount();
cur.moveToFirst();
String name = cur.getString(nameIndex);
String size =Long.toString(cur.getLong(sizeIndex))+" B";
String mimeType = getContentResolver().getType(uri);
Log.d("xuehao","name=" +name+" size="+size +" colCount ="+colCount+" cursor="+cur.toString());
FileInputStream is = null;
long length = 0;
length =cur.getLong(cur.getColumnIndex(OpenableColumns.SIZE));
try {
// We've found that content providers don't always have the
// right size in _OpenableColumns.SIZE
// As a second source of getting the correct file length,
// get a file descriptor and get the stat length
AssetFileDescriptor fd = getContentResolver().openAssetFileDescriptor(uri, "r");
long statLength = fd.getLength();
if (length != statLength && statLength > 0) {
Log.e("xuehao", "Content provider length is wrong (" + Long.toString(length) +
"), using stat length (" + Long.toString(statLength) + ")");
length = statLength;
}
try {
// This creates an auto-closing input-stream, so
// the file descriptor will be closed whenever the InputStream
// is closed.
is = fd.createInputStream();
// If the database doesn't contain the file size, get the size
// by reading through the entire stream
if (length == 0) {
length = FileUtil.getStreamSize(is);
Log.w("xuehao", "File length not provided. Length from stream = "
+ length);
// Reset the stream
fd = getContentResolver().openAssetFileDescriptor(uri, "r");
is = fd.createInputStream();
}
} catch (IOException e) {
try {
fd.close();
} catch (IOException e2) {
// Ignore
}
}
} catch (FileNotFoundException e) {
// Ignore
}
if (is == null) {
try {
is = (FileInputStream) getContentResolver().openInputStream(uri);
// If the database doesn't contain the file size, get the size
// by reading through the entire stream
if (length == 0) {
length = FileUtil.getStreamSize(is);
// Reset the stream
is = (FileInputStream) getContentResolver().openInputStream(uri);
}
} catch (FileNotFoundException e) {
return ;
} catch (IOException e) {
return ;
}
}
if (length == 0) {
Log.e("xuehao", "Could not determine size of file");
return ;
}
ShareSendFileInfo si = new ShareSendFileInfo(name,mimeType , length, is, 0);
Log.d("xuehao"," handleUriMethod... si="+si );
try {
byte[] data = FileUtil.inputStreamToByte(is);
for(byte bt: data){
// Log.d("xuehao"," handleUriMethod... bt="+bt );
}
File newFile = new File(this.getFilesDir(),"new_"+name);
Log.d("xuehao"," handleUriMethod... newFile" );
newFile.createNewFile();
newFile.setExecutable(true,false);
newFile.setReadable(true,false);
newFile.setWritable(true,false);
FileUtil.scanFile(this, newFile) ;
boolean isext = newFile.exists();
Log.d("xuehao"," handleUriMethod...1 isext="+isext );
// n
FileUtil.byteToFile(data,newFile,this );
boolean isext2 = newFile.exists();
Log.d("xuehao"," handleUriMethod...2 isext="+isext2 );
Log.d("xuehao"," to startActivity newFile="+newFile.getAbsolutePath()+" size="+ newFile.length());
Intent mintent = FileUtil.getIntentByFileType(mimeType, newFile);
if(mintent!=null)
startActivity(mintent);
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("xuehao"," handleUriMethod...IOException " );
e.printStackTrace();
}
}else{
Log.d("xuehao"," handleUriMethod... null.");
}
}
文件处理工具类:
package util;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
public class FileUtil {
public static final byte[] inputStreamToByte(FileInputStream inStream)
throws IOException {
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while ((rc = inStream.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
byte[] in2b = swapStream.toByteArray();
return in2b;
}
public static final FileInputStream byteToInStream(byte[] buffer){
InputStream sbs = new ByteArrayInputStream(buffer);
return (FileInputStream) sbs;
}
// 将 byte[]二进制数据转化为 File 文件
@SuppressWarnings("resource")
public static void byteToFile(byte[] buffer, File newFile,Context context){
FileOutputStream output = null;
BufferedOutputStream bufferedOutput = null;
try {
output = new FileOutputStream(newFile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
bufferedOutput = new BufferedOutputStream(output);
try {
bufferedOutput.write(buffer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if(bufferedOutput!=null){
try {
bufferedOutput.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(output!=null){
try {
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// 更新文件夹
public static void scanDir(Context context, File dir) {
Log.i("xuehao","send broadcast to scan dir = " + dir);
String path = dir.getPath();
Intent intent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_DIR");
Bundle bundle = new Bundle();
bundle.putString("scan_dir_path", path);
intent.putExtras(bundle);
context.sendBroadcast(intent);
}
public static void scanFile(Context context, File file) {
Log.i("xuehao", "send broadcast to scan file");
android.media.MediaScannerConnection.scanFile(context.getApplicationContext(),
new String[]{ file.getAbsolutePath() }, null, null);
}
public static long getStreamSize(FileInputStream is) throws IOException {
long length = 0;
byte unused[] = new byte[4096];
while (is.available() > 0) {
length += is.read(unused, 0, 4096);
}
return length;
}
public static Intent getIntentByFileType( String mimeType, File file) {
if (file == null ) {
Log.d("xuehao", " null intent 1");
return null;
}else if(!file.exists()){
Log.d("xuehao", " null intent 2");
return null;
}else if(!file.canRead()){
Log.d("xuehao", " null intent 3");
return null;
}
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
String type = getMIMEType(file,mimeType);
Uri muri =Uri.fromFile(file);
Log.d("xuehao", " type="+type+" muri= "+muri);
intent.setDataAndType(muri, type);
return intent;
}
private static String getMIMEType(File file,String mimeType){
String type="*";
String fName = file.getName();
final int dotIndex = fName.lastIndexOf(".");
String extensionName = getExtensionName(fName, dotIndex);
//在MIME和文件类型的匹配表中找到对应的MIME类型。
for(int i=0;i<MIME_MapTable.length;i++){
if(extensionName.equals(MIME_MapTable[i][0]))
type = MIME_MapTable[i][1];
}
if(mimeType!=null){
return mimeType;
}
return type;
}
private static String getExtensionName(String fileName, int dotIndex) {
if (fileName != null && (fileName.length() > 0)) {
if ((dotIndex > -1) && (dotIndex < (fileName.length() - 1))) {
return fileName.substring(dotIndex);
}
}
return fileName;
}
private static final String[][] MIME_MapTable = {
//{后缀名,MIME类型}
{"3gp", "video/3gpp"},
{"aab", "application/x-authoware-bin"},
{"aam", "application/x-authoware-map"},
{"aas", "application/x-authoware-seg"},
{"ai", "application/postscript"},
{"aif", "audio/x-aiff"},
{"aifc", "audio/x-aiff"},
{"aiff", "audio/x-aiff"},
{"als", "audio/X-Alpha5"},
{"amc", "application/x-mpeg"},
{"ani", "application/octet-stream"},
{"apk", "application/vnd.android.package-archive"},
{"asc", "text/plain"},
{"asd", "application/astound"},
{"asf", "video/x-ms-asf"},
{"asn", "application/astound"},
{"asp", "application/x-asap"},
{"asx", "video/x-ms-asf"},
{"au", "audio/basic"},
{"avb", "application/octet-stream"},
{"avi", "video/x-msvideo"},
{"awb", "audio/amr-wb"},
{"bcpio", "application/x-bcpio"},
{"bin", "application/octet-stream"},
{"bld", "application/bld"},
{"bld2", "application/bld2"},
{"bmp", "image/bmp"},
{"bpk", "application/octet-stream"},
{"bz2", "application/x-bzip2"},
{"c", "text/plain"},
{"cal", "image/x-cals"},
{"ccn", "application/x-cnc"},
{"cco", "application/x-cocoa"},
{"cdf", "application/x-netcdf"},
{"cgi", "magnus-internal/cgi"},
{"chat", "application/x-chat"},
{"class", "application/octet-stream"},
{"clp", "application/x-msclip"},
{"cmx", "application/x-cmx"},
{"co", "application/x-cult3d-object"},
{"cod", "image/cis-cod"},
{"conf", "text/plain"},
{"cpio", "application/x-cpio"},
{"cpp", "text/plain"},
{"cpt", "application/mac-compactpro"},
{"crd", "application/x-mscardfile"},
{"csh", "application/x-csh"},
{"csm", "chemical/x-csml"},
{"csml", "chemical/x-csml"},
{"css", "text/css"},
{"cur", "application/octet-stream"},
{"dcm", "x-lml/x-evm"},
{"dcr", "application/x-director"},
{"dcx", "image/x-dcx"},
{"dhtml", "text/html"},
{"dir", "application/x-director"},
{"dll", "application/octet-stream"},
{"dmg", "application/octet-stream"},
{"dms", "application/octet-stream"},
{"doc", "application/msword"},
{"docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
{"dot", "application/x-dot"},
{"dvi", "application/x-dvi"},
{"dwf", "drawing/x-dwf"},
{"dwg", "application/x-autocad"},
{"dxf", "application/x-autocad"},
{"dxr", "application/x-director"},
{"ebk", "application/x-expandedbook"},
{"emb", "chemical/x-embl-dl-nucleotide"},
{"embl", "chemical/x-embl-dl-nucleotide"},
{"eps", "application/postscript"},
{"eri", "image/x-eri"},
{"es", "audio/echospeech"},
{"esl", "audio/echospeech"},
{"etc", "application/x-earthtime"},
{"etx", "text/x-setext"},
{"evm", "x-lml/x-evm"},
{"evy", "application/x-envoy"},
{"exe", "application/octet-stream"},
{"fh4", "image/x-freehand"},
{"fh5", "image/x-freehand"},
{"fhc", "image/x-freehand"},
{"fif", "image/fif"},
{"fm", "application/x-maker"},
{"fpx", "image/x-fpx"},
{"fvi", "video/isivideo"},
{"gau", "chemical/x-gaussian-input"},
{"gca", "application/x-gca-compressed"},
{"gdb", "x-lml/x-gdb"},
{"gif", "image/gif"},
{"gps", "application/x-gps"},
{"gtar", "application/x-gtar"},
{"gz", "application/x-gzip"},
{"h", "text/plain"},
{"hdf", "application/x-hdf"},
{"hdm", "text/x-hdml"},
{"hdml", "text/x-hdml"},
{"hlp", "application/winhlp"},
{"hqx", "application/mac-binhex40"},
{"htm", "text/html"},
{"html", "text/html"},
{"hts", "text/html"},
{"ice", "x-conference/x-cooltalk"},
{"ico", "application/octet-stream"},
{"ief", "image/ief"},
{"ifm", "image/gif"},
{"ifs", "image/ifs"},
{"imy", "audio/melody"},
{"ins", "application/x-NET-Install"},
{"ips", "application/x-ipscript"},
{"ipx", "application/x-ipix"},
{"it", "audio/x-mod"},
{"itz", "audio/x-mod"},
{"ivr", "i-world/i-vrml"},
{"j2k", "image/j2k"},
{"jad", "text/vnd.sun.j2me.app-descriptor"},
{"jam", "application/x-jam"},
{"jar", "application/java-archive"},
{"java", "text/plain"},
{"jnlp", "application/x-java-jnlp-file"},
{"jpe", "image/jpeg"},
{"jpeg", "image/jpeg"},
{"jpg", "image/jpeg"},
{"jpz", "image/jpeg"},
{"js", "application/x-javascript"},
{"jwc", "application/jwc"},
{"kjx", "application/x-kjx"},
{"lak", "x-lml/x-lak"},
{"latex", "application/x-latex"},
{"lcc", "application/fastman"},
{"lcl", "application/x-digitalloca"},
{"lcr", "application/x-digitalloca"},
{"lgh", "application/lgh"},
{"lha", "application/octet-stream"},
{"lml", "x-lml/x-lml"},
{"lmlpack", "x-lml/x-lmlpack"},
{"log", "text/plain"},
{"lsf", "video/x-ms-asf"},
{"lsx", "video/x-ms-asf"},
{"lzh", "application/x-lzh"},
{"m13", "application/x-msmediaview"},
{"m14", "application/x-msmediaview"},
{"m15", "audio/x-mod"},
{"m3u", "audio/x-mpegurl"},
{"m3url", "audio/x-mpegurl"},
{"m4a", "audio/mp4a-latm"},
{"m4b", "audio/mp4a-latm"},
{"m4p", "audio/mp4a-latm"},
{"m4u", "video/vnd.mpegurl"},
{"m4v", "video/x-m4v"},
{"ma1", "audio/ma1"},
{"ma2", "audio/ma2"},
{"ma3", "audio/ma3"},
{"ma5", "audio/ma5"},
{"man", "application/x-troff-man"},
{"map", "magnus-internal/imagemap"},
{"mbd", "application/mbedlet"},
{"mct", "application/x-mascot"},
{"mdb", "application/x-msaccess"},
{"mdz", "audio/x-mod"},
{"me", "application/x-troff-me"},
{"mel", "text/x-vmel"},
{"mi", "application/x-mif"},
{"mid", "audio/midi"},
{"midi", "audio/midi"},
{"mif", "application/x-mif"},
{"mil", "image/x-cals"},
{"mio", "audio/x-mio"},
{"mmf", "application/x-skt-lbs"},
{"mng", "video/x-mng"},
{"mny", "application/x-msmoney"},
{"moc", "application/x-mocha"},
{"mocha", "application/x-mocha"},
{"mod", "audio/x-mod"},
{"mof", "application/x-yumekara"},
{"mol", "chemical/x-mdl-molfile"},
{"mop", "chemical/x-mopac-input"},
{"mov", "video/quicktime"},
{"movie", "video/x-sgi-movie"},
{"mp2", "audio/x-mpeg"},
{"mp3", "audio/x-mpeg"},
{"mp4", "video/mp4"},
{"mpc", "application/vnd.mpohun.certificate"},
{"mpe", "video/mpeg"},
{"mpeg", "video/mpeg"},
{"mpg video/mpeg"},
{"mpg4", "video/mp4"},
{"mpga", "audio/mpeg"},
{"mpn", "application/vnd.mophun.application"},
{"mpp", "application/vnd.ms-project"},
{"mps", "application/x-mapserver"},
{"mrl", "text/x-mrml"},
{"mrm", "application/x-mrm"},
{"ms", "application/x-troff-ms"},
{"msg", "application/vnd.ms-outlook"},
{"mts", "application/metastream"},
{"mtx", "application/metastream"},
{"mtz", "application/metastream"},
{"mzv", "application/metastream"},
{"nar", "application/zip"},
{"nbmp", "image/nbmp"},
{"nc", "application/x-netcdf"},
{"ndb", "x-lml/x-ndb"},
{"ndwn", "application/ndwn"},
{"nif", "application/x-nif"},
{"nmz", "application/x-scream"},
{"nokia-op-logo", "image/vnd.nok-oplogo-color"},
{"npx", "application/x-netfpx"},
{"nsnd", "audio/nsnd"},
{"nva", "application/x-neva1"},
{"oda", "application/oda"},
{"ogg", "audio/ogg"},
{"oom", "application/x-AtlasMate-Plugin"},
{"pac", "audio/x-pac"},
{"pae", "audio/x-epac"},
{"pan", "application/x-pan"},
{"pbm", "image/x-portable-bitmap"},
{"pcx", "image/x-pcx"},
{"pda", "image/x-pda"},
{"pdb", "chemical/x-pdb"},
{"pdf", "application/pdf"},
{"pfr", "application/font-tdpfr"},
{"pgm", "image/x-portable-graymap"},
{"pict", "image/x-pict"},
{"pm", "application/x-perl"},
{"pmd", "application/x-pmd"},
{"png", "image/png"},
{"pnm", "image/x-portable-anymap"},
{"pnz", "image/png"},
{"pot", "application/vnd.ms-powerpoint"},
{"ppm", "image/x-portable-pixmap"},
{"pps", "application/vnd.ms-powerpoint"},
{"ppt", "application/vnd.ms-powerpoint"},
{"pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
{"pqf", "application/x-cprplayer"},
{"pqi", "application/cprplayer"},
{"prc", "application/x-prc"},
{"prop", "text/plain"},
{"proxy", "application/x-ns-proxy-autoconfig"},
{"ps", "application/postscript"},
{"ptlk", "application/listenup"},
{"pub", "application/x-mspublisher"},
{"pvx", "video/x-pv-pvx"},
{"qcp", "audio/vnd.qcelp"},
{"qt", "video/quicktime"},
{"qti", "image/x-quicktime"},
{"qtif", "image/x-quicktime"},
{"r3t", "text/vnd.rn-realtext3d"},
{"ra", "audio/x-pn-realaudio"},
{"ram", "audio/x-pn-realaudio"},
{"rar", "application/x-rar-compressed"},
{"ras", "image/x-cmu-raster"},
{"rc", "text/plain"},
{"rdf", "application/rdf+xml"},
{"rf", "image/vnd.rn-realflash"},
{"rgb", "image/x-rgb"},
{"rlf", "application/x-richlink"},
{"rm", "audio/x-pn-realaudio"},
{"rmf", "audio/x-rmf"},
{"rmm", "audio/x-pn-realaudio"},
{"rmvb", "audio/x-pn-realaudio"},
{"rnx", "application/vnd.rn-realplayer"},
{"roff", "application/x-troff"},
{"rp", "image/vnd.rn-realpix"},
{"rpm", "audio/x-pn-realaudio-plugin"},
{"rt", "text/vnd.rn-realtext"},
{"rte", "x-lml/x-gps"},
{"rtf", "application/rtf"},
{"rtg", "application/metastream"},
{"rtx", "text/richtext"},
{"rv", "video/vnd.rn-realvideo"},
{"rwc", "application/x-rogerwilco"},
{"s3m", "audio/x-mod"},
{"s3z", "audio/x-mod"},
{"sca", "application/x-supercard"},
{"scd", "application/x-msschedule"},
{"sdf", "application/e-score"},
{"sea", "application/x-stuffit"},
{"sgm", "text/x-sgml"},
{"sgml", "text/x-sgml"},
{"sh", "application/x-sh"},
{"shar", "application/x-shar"},
{"shtml", "magnus-internal/parsed-html"},
{"shw", "application/presentations"},
{"si6", "image/si6"},
{"si7", "image/vnd.stiwap.sis"},
{"si9", "image/vnd.lgtwap.sis"},
{"sis", "application/vnd.symbian.install"},
{"sit", "application/x-stuffit"},
{"skd", "application/x-Koan"},
{"skm", "application/x-Koan"},
{"skp", "application/x-Koan"},
{"skt", "application/x-Koan"},
{"slc", "application/x-salsa"},
{"smd", "audio/x-smd"},
{"smi", "application/smil"},
{"smil", "application/smil"},
{"smp", "application/studiom"},
{"smz", "audio/x-smd"},
{"snd", "audio/basic"},
{"spc", "text/x-speech"},
{"spl", "application/futuresplash"},
{"spr", "application/x-sprite"},
{"sprite", "application/x-sprite"},
{"spt", "application/x-spt"},
{"src", "application/x-wais-source"},
{"stk", "application/hyperstudio"},
{"stm", "audio/x-mod"},
{"sv4cpio", "application/x-sv4cpio"},
{"sv4crc", "application/x-sv4crc"},
{"svf", "image/vnd"},
{"svg", "image/svg-xml"},
{"svh", "image/svh"},
{"svr", "x-world/x-svr"},
{"swf", "application/x-shockwave-flash"},
{"swfl", "application/x-shockwave-flash"},
{"t", "application/x-troff"},
{"tad", "application/octet-stream"},
{"talk", "text/x-speech"},
{"tar", "application/x-tar"},
{"taz", "application/x-tar"},
{"tbp", "application/x-timbuktu"},
{"tbt", "application/x-timbuktu"},
{"tcl", "application/x-tcl"},
{"tex", "application/x-tex"},
{"texi", "application/x-texinfo"},
{"texinfo", "application/x-texinfo"},
{"tgz", "application/x-tar"},
{"thm", "application/vnd.eri.thm"},
{"tif", "image/tiff"},
{"tiff", "image/tiff"},
{"tki", "application/x-tkined"},
{"tkined", "application/x-tkined"},
{"toc", "application/toc"},
{"toy", "image/toy"},
{"tr", "application/x-troff"},
{"trk", "x-lml/x-gps"},
{"trm", "application/x-msterminal"},
{"tsi", "audio/tsplayer"},
{"tsp", "application/dsptype"},
{"tsv", "text/tab-separated-values"},
{"tsv", "text/tab-separated-values"},
{"ttf", "application/octet-stream"},
{"ttz", "application/t-time"},
{"txt", "text/plain"},
{"ult", "audio/x-mod"},
{"ustar", "application/x-ustar"},
{"uu", "application/x-uuencode"},
{"uue", "application/x-uuencode"},
{"vcd", "application/x-cdlink"},
{"vcf", "text/x-vcard"},
{"vdo", "video/vdo"},
{"vib", "audio/vib"},
{"viv", "video/vivo"},
{"vivo", "video/vivo"},
{"vmd", "application/vocaltec-media-desc"},
{"vmf", "application/vocaltec-media-file"},
{"vmi", "application/x-dreamcast-vms-info"},
{"vms", "application/x-dreamcast-vms"},
{"vox", "audio/voxware"},
{"vqe", "audio/x-twinvq-plugin"},
{"vqf", "audio/x-twinvq"},
{"vql", "audio/x-twinvq"},
{"vre", "x-world/x-vream"},
{"vrml", "x-world/x-vrml"},
{"vrt", "x-world/x-vrt"},
{"vrw", "x-world/x-vream"},
{"vts", "workbook/formulaone"},
{"wav", "audio/x-wav"},
{"wax", "audio/x-ms-wax"},
{"wbmp", "image/vnd.wap.wbmp"},
{"web", "application/vnd.xara"},
{"wi", "image/wavelet"},
{"wis", "application/x-InstallShield"},
{"wm", "video/x-ms-wm"},
{"wma", "audio/x-ms-wma"},
{"wmd", "application/x-ms-wmd"},
{"wmf", "application/x-msmetafile"},
{"wml", "text/vnd.wap.wml"},
{"wmlc", "application/vnd.wap.wmlc"},
{"wmls", "text/vnd.wap.wmlscript"},
{"wmlsc", "application/vnd.wap.wmlscriptc"},
{"wmlscript", "text/vnd.wap.wmlscript"},
{"wmv", "audio/x-ms-wmv"},
{"wmx", "video/x-ms-wmx"},
{"wmz", "application/x-ms-wmz"},
{"wpng", "image/x-up-wpng"},
{"wps", "application/vnd.ms-works"},
{"wpt", "x-lml/x-gps"},
{"wri", "application/x-mswrite"},
{"wrl", "x-world/x-vrml"},
{"wrz", "x-world/x-vrml"},
{"ws", "text/vnd.wap.wmlscript"},
{"wsc", "application/vnd.wap.wmlscriptc"},
{"wv", "video/wavelet"},
{"wvx", "video/x-ms-wvx"},
{"wxl", "application/x-wxl"},
{"x-gzip", "application/x-gzip"},
{"xar", "application/vnd.xara"},
{"xbm", "image/x-xbitmap"},
{"xdm", "application/x-xdma"},
{"xdma", "application/x-xdma"},
{"xdw", "application/vnd.fujixerox.docuworks"},
{"xht", "application/xhtml+xml"},
{"xhtm", "application/xhtml+xml"},
{"xhtml", "application/xhtml+xml"},
{"xla", "application/vnd.ms-excel"},
{"xlc", "application/vnd.ms-excel"},
{"xll", "application/x-excel"},
{"xlm", "application/vnd.ms-excel"},
{"xls", "application/vnd.ms-excel"},
{"xlt", "application/vnd.ms-excel"},
{"xlw", "application/vnd.ms-excel"},
{"xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
{"xm", "audio/x-mod"},
{"xml", "text/xml"},
{"xmz", "audio/x-mod"},
{"xpi", "application/x-xpinstall"},
{"xpm", "image/x-xpixmap"},
{"xsit", "text/xml"},
{"xsl", "text/xml"},
{"xul", "text/xul"},
{"xwd", "image/x-xwindowdump"},
{"xyz", "chemical/x-pdb"},
{"yz1", "application/x-yz1"},
{"z", "application/x-compress"},
{"zac", "application/x-zaurus-zac"},
{"zip", "application/zip"},
{"", "*/*"}
};
}