通过ftp服务器下载文件

package com.dhcc.tjcx.util;

import com.dhcc.basic.exception.BusinessException;
import com.dhcc.frameapi.model.SpDict;
import com.dhcc.frameapi.model.SpDictVal;
import com.dhcc.htba.util.HttpRequestUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import sun.misc.BASE64Encoder;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName PathUtil
 * @Description TODO
 * @Author Mr.Zhang
 * @Date 2023/6/16 8:41
 * @Version 1.0
 */
@Component
public class PathUtil {

    private static Logger log = LoggerFactory.getLogger(PathUtil.class);

    public static void main(String[] args) {
//        downFileByPath("192.168.0.149", 21, "administrator", "scc123dykj$%^wj", "image/y2018/m09/d18", "D:\\data\\", "20180918002.tif");
        String base64 = viewFile("192.168.0.149", 21, "administrator", "scc123dykj$%^wj", "Photo/y2015/m10/d20/i20151020114/", "zpi20151020114_2_rx.jpg");
        System.out.println(base64);
//        downFileByPath("localhost",21,"Heaven","l","y2018/m09/d18","D:\\data\\","20180918001.tif");
    }

    /**
     * Description: 从FTP服务器下载指定文件
     *
     * @param url        FTP服务器hostname
     * @param port       FTP服务器端口
     * @param username   FTP登录账号
     * @param password   FTP登录密码
     * @param remotePath FTP服务器上的相对路径
     * @param localPath  下载后保存到本地的路径
     * @param fileName   文件名称
     * @return 下载的文件数
     */
    public static boolean downFileByPath(String url, int port, String username, String password, String remotePath, String localPath, String fileName) {
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(url, port);
            //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            ftp.login(username, password);//登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return false;
            }
            //转移到FTP服务器目录
            boolean result = ftp.changeWorkingDirectory(remotePath);
            //转移到指定目录失败
            if (!result) {
                log.error("找不到指定的ftp服务器目录:" + remotePath);
            }

            File localFile = new File(localPath + "/" + fileName);
            OutputStream is = null;
            File path = new File(localPath);
            if (!((new File(localPath)).exists())) {
                path.mkdirs();
            }
            is = new FileOutputStream(localFile);
            boolean flag = ftp.retrieveFile(new String(fileName.getBytes("UTF-8"), "ISO-8859-1"), is);
            if (flag) {
                log.info("下载成功!");
            } else {
                log.info("下载失败!");
            }
            if (ftp.getReplyCode() != 226) {
                log.info(fileName + "下载失败,失败原因:" + ftp.getReplyString());
                throw new RuntimeException(fileName + "下载失败,失败原因:" + ftp.getReplyString());
            }
            ftp.logout();
        } catch (IOException e) {
            log.error("异常!" + e);
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                    log.error("io异常!" + ioe);
                }
            }
        }
        return true;
    }

    /**
     * 功能描述: 通过浏览器的方式下载ftp文件
     *
     * @Param: [url, port, username, password, ftpFilePath, fileName, response]
     * 文件host地址,端口,用户名,密码,ftp虚拟路径,文件名称(包含后缀)
     * @Return: void
     */
    public static void downloadFile(String url, int port, String username, String password, String ftpFilePath, String fileName, HttpServletResponse response) {
        FTPClient ftpClient = new FTPClient();
        //设置传输命令的超时
        ftpClient.setDefaultTimeout(200000);//毫秒
        //设置两个服务连接超时时间
        ftpClient.setConnectTimeout(100000);//毫秒
        //被动模式下设置数据传输的超时时间
        ftpClient.setDataTimeout(150000);//毫秒
        //被动模式
        ftpClient.enterLocalPassiveMode();

        InputStream input = null;
        OutputStream out = null;
        try {
            //连接FTP
            ftpClient.connect(url, port);
            //更加账户密码登录服务
            ftpClient.login(username, password);
//            response.reset();
            //此处你就根据你要下载的类型去设置即可,比如我下载.avi格式的文件,可以设置response.setContentType("video/avi");
//            response.setContentType("image/tiff");
            response.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));
            //解决中文不能生成文件
            response.setHeader("Content-Disposition", "attachment; fileName=" + URLEncoder.encode(fileName, "UTF-8"));
            //设置解决跨域问题
//            response.setHeader("Access-Control-Allow-Origin","*");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            ftpClient.setControlEncoding("utf-8");
            //传输模式
            ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
            // 设置以二进制流的方式传输
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            //进入目录
            ftpClient.changeWorkingDirectory(ftpFilePath);
//            FTPFile[] files = ftpClient.listFiles();
//            if (files.length < 1) {
//                log.error("目录为空");
//            }
//            boolean fileExist = false;
//            for (FTPFile ftpFile : files) {
//                String ftpFileName=new String(ftpFile.getName());
//                if (fileName.equals(ftpFileName)) {
//                    fileExist = true;
            input = ftpClient.retrieveFileStream(new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
            out = response.getOutputStream();
            int len;
            byte[] bytes = new byte[1024];
            while ((len = input.read(bytes)) != -1) {
                out.write(bytes, 0, len);
            }
            out.flush();
//                    break;
//                }
//            }
//            if (!fileExist) {
//                log.error("FTP服务器上文件不存在");
//            }
        } catch (IOException e) {

            e.printStackTrace();
            log.error("获取文件失败,请联系管理员");
            throw new BusinessException("获取文件失败,请联系管理员");
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (input != null) {
                    input.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (ftpClient != null && ftpClient.isConnected()) {
                    ftpClient.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 功能描述: 返回base64
     *
     * @Param: [url, port, username, password, ftpFilePath, fileName, response]
     * 文件host地址,端口,用户名,密码,ftp虚拟路径,文件名称(包含后缀)
     * @Return: void
     */
    public static String viewFile(String url, int port, String username, String password, String ftpFilePath, String fileName) {
        FTPClient ftpClient = new FTPClient();
        //设置传输命令的超时
        ftpClient.setDefaultTimeout(20000);//毫秒
        //设置两个服务连接超时时间
        ftpClient.setConnectTimeout(10000);//毫秒
        //被动模式下设置数据传输的超时时间
        ftpClient.setDataTimeout(15000);//毫秒
        //被动模式
        ftpClient.enterLocalPassiveMode();

        InputStream input = null;
        OutputStream out = null;
        try {
            //连接FTP
            ftpClient.connect(url, port);
            //更加账户密码登录服务
            ftpClient.login(username, password);
            ftpClient.setControlEncoding("utf-8");
            //传输模式
            ftpClient.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
            // 设置以二进制流的方式传输
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            //进入目录
            ftpClient.changeWorkingDirectory(ftpFilePath);
//            FTPFile[] files = ftpClient.lo();
//            if (files.length < 1) {
//                log.error("目录为空");
//            }
//            boolean fileExist = false;
//            for (FTPFile ftpFile : files) {
//                String ftpFileName=new String(ftpFile.getName());
//                if (fileName.equals(ftpFileName)) {
//                    fileExist = true;
            input = ftpClient.retrieveFileStream(new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
            byte[] bytes = null;
            bytes = read(input); //解决图片显示不全问题
//                    break;
//                }
//            }
//            if (!fileExist) {
//                log.error("FTP服务器上文件不存在");
//            }
            BASE64Encoder encoder = new BASE64Encoder();
            String base64Str = encoder.encode(bytes).replaceAll("\\r\\n", ""); //bytes转base64
            return "data:" + getContentType(fileName.substring(fileName.lastIndexOf("."))) + ";base64," + base64Str;
        } catch (IOException e) {
            e.printStackTrace();
            log.error("下载文件异常");
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (input != null) {
                    input.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (ftpClient != null && ftpClient.isConnected()) {
                    ftpClient.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }


    public static byte[] read(InputStream inputStream) throws IOException {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int num = inputStream.read(buffer);
            while (num != -1) {
                baos.write(buffer, 0, num);
                num = inputStream.read(buffer);
            }
            baos.flush();
            return baos.toByteArray();
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
        }
    }

    //根据fileName获取tif文件路径
    public static String getTiffPathByIncomeId(String fileId) {
        if (StringUtils.isNotBlank(fileId)) {
            String ls_year = 'y' + fileId.substring(0, 4);
            String ls_month = 'm' + fileId.substring(4, 6);
            String ls_day = 'd' + fileId.substring(6, 8);
            return ls_year + '/' + ls_month + '/' + ls_day + '/';
        }
        return null;
    }

    //根据fileName获取tif文件路径
    public static String getPhotoPathByIncomeId(String incomeId) {
        if (StringUtils.isNotBlank(incomeId)) {
            String ls_year = 'y' + incomeId.substring(0, 4);
            String ls_month = 'm' + incomeId.substring(4, 6);
            String ls_day = 'd' + incomeId.substring(6, 8);
            String ls_income_id = "i" + incomeId;
            return ls_year + '/' + ls_month + '/' + ls_day + '/' + ls_income_id + '/';
        }
        return null;
    }

    /**
     * 两种初始化Map常量
     * 1.new HashMap
     * 2.static 静态代码块
     */
    Map map = new HashMap();
    static Map<String, String> contentType = new HashMap<String, String>(200);

    /*{
        {
            put(".jpg","image/jpeg");
            put(".jpeg","image/jpeg");
        }
    };*/
    //通过key获取ContentType值
    public static String getContentType(String ext) {
        return contentType.get(ext);
    }

    static {
        contentType.put(".load", "text/html");
        contentType.put(".123", "application/vnd.lotus-1-2-3");
        contentType.put(".3ds", "image/x-3ds");
        contentType.put(".3g2", "video/3gpp");
        contentType.put(".3ga", "video/3gpp");
        contentType.put(".3gp", "video/3gpp");
        contentType.put(".3gpp", "video/3gpp");
        contentType.put(".602", "application/x-t602");
        contentType.put(".669", "audio/x-mod");
        contentType.put(".7z", "application/x-7z-compressed");
        contentType.put(".a", "application/x-archive");
        contentType.put(".aac", "audio/mp4");
        contentType.put(".abw", "application/x-abiword");
        contentType.put(".abw.crashed", "application/x-abiword");
        contentType.put(".abw.gz", "application/x-abiword");
        contentType.put(".ac3", "audio/ac3");
        contentType.put(".ace", "application/x-ace");
        contentType.put(".adb", "text/x-adasrc");
        contentType.put(".ads", "text/x-adasrc");
        contentType.put(".afm", "application/x-font-afm");
        contentType.put(".ag", "image/x-applix-graphics");
        contentType.put(".ai", "application/illustrator");
        contentType.put(".aif", "audio/x-aiff");
        contentType.put(".aifc", "audio/x-aiff");
        contentType.put(".aiff", "audio/x-aiff");
        contentType.put(".al", "application/x-perl");
        contentType.put(".alz", "application/x-alz");
        contentType.put(".amr", "audio/amr");
        contentType.put(".ani", "application/x-navi-animation");
        contentType.put(".anim[1-9j]", "video/x-anim");
        contentType.put(".anx", "application/annodex");
        contentType.put(".ape", "audio/x-ape");
        contentType.put(".arj", "application/x-arj");
        contentType.put(".arw", "image/x-sony-arw");
        contentType.put(".as", "application/x-applix-spreadsheet");
        contentType.put(".asc", "text/plain");
        contentType.put(".asf", "video/x-ms-asf");
        contentType.put(".asp", "application/x-asp");
        contentType.put(".ass", "text/x-ssa");
        contentType.put(".asx", "audio/x-ms-asx");
        contentType.put(".atom", "application/atom+xml");
        contentType.put(".au", "audio/basic");
        contentType.put(".avi", "video/x-msvideo");
        contentType.put(".aw", "application/x-applix-word");
        contentType.put(".awb", "audio/amr-wb");
        contentType.put(".awk", "application/x-awk");
        contentType.put(".axa", "audio/annodex");
        contentType.put(".axv", "video/annodex");
        contentType.put(".bak", "application/x-trash");
        contentType.put(".bcpio", "application/x-bcpio");
        contentType.put(".bdf", "application/x-font-bdf");
        contentType.put(".bib", "text/x-bibtex");
        contentType.put(".bin", "application/octet-stream");
        contentType.put(".blend", "application/x-blender");
        contentType.put(".blender", "application/x-blender");
        contentType.put(".bmp", "image/bmp");
        contentType.put(".bz", "application/x-bzip");
        contentType.put(".bz2", "application/x-bzip");
        contentType.put(".c", "text/x-csrc");
        contentType.put(".c++", "text/x-c++src");
        contentType.put(".cab", "application/vnd.ms-cab-compressed");
        contentType.put(".cb7", "application/x-cb7");
        contentType.put(".cbr", "application/x-cbr");
        contentType.put(".cbt", "application/x-cbt");
        contentType.put(".cbz", "application/x-cbz");
        contentType.put(".cc", "text/x-c++src");
        contentType.put(".cdf", "application/x-netcdf");
        contentType.put(".cdr", "application/vnd.corel-draw");
        contentType.put(".cer", "application/x-x509-ca-cert");
        contentType.put(".cert", "application/x-x509-ca-cert");
        contentType.put(".cgm", "image/cgm");
        contentType.put(".chm", "application/x-chm");
        contentType.put(".chrt", "application/x-kchart");
        contentType.put(".class", "application/x-java");
        contentType.put(".cls", "text/x-tex");
        contentType.put(".cmake", "text/x-cmake");
        contentType.put(".cpio", "application/x-cpio");
        contentType.put(".cpio.gz", "application/x-cpio-compressed");
        contentType.put(".cpp", "text/x-c++src");
        contentType.put(".cr2", "image/x-canon-cr2");
        contentType.put(".crt", "application/x-x509-ca-cert");
        contentType.put(".crw", "image/x-canon-crw");
        contentType.put(".cs", "text/x-csharp");
        contentType.put(".csh", "application/x-csh");
        contentType.put(".css", "text/css");
        contentType.put(".cssl", "text/css");
        contentType.put(".csv", "text/csv");
        contentType.put(".cue", "application/x-cue");
        contentType.put(".cur", "image/x-win-bitmap");
        contentType.put(".cxx", "text/x-c++src");
        contentType.put(".d", "text/x-dsrc");
        contentType.put(".dar", "application/x-dar");
        contentType.put(".dbf", "application/x-dbf");
        contentType.put(".dc", "application/x-dc-rom");
        contentType.put(".dcl", "text/x-dcl");
        contentType.put(".dcm", "application/dicom");
        contentType.put(".dcr", "image/x-kodak-dcr");
        contentType.put(".dds", "image/x-dds");
        contentType.put(".deb", "application/x-deb");
        contentType.put(".der", "application/x-x509-ca-cert");
        contentType.put(".desktop", "application/x-desktop");
        contentType.put(".dia", "application/x-dia-diagram");
        contentType.put(".diff", "text/x-patch");
        contentType.put(".divx", "video/x-msvideo");
        contentType.put(".djv", "image/vnd.djvu");
        contentType.put(".djvu", "image/vnd.djvu");
        contentType.put(".dng", "image/x-adobe-dng");
        contentType.put(".doc", "application/msword");
        contentType.put(".docbook", "application/docbook+xml");
        contentType.put(".docm", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        contentType.put(".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        contentType.put(".dot", "text/vnd.graphviz");
        contentType.put(".dsl", "text/x-dsl");
        contentType.put(".dtd", "application/xml-dtd");
        contentType.put(".dtx", "text/x-tex");
        contentType.put(".dv", "video/dv");
        contentType.put(".dvi", "application/x-dvi");
        contentType.put(".dvi.bz2", "application/x-bzdvi");
        contentType.put(".dvi.gz", "application/x-gzdvi");
        contentType.put(".dwg", "image/vnd.dwg");
        contentType.put(".dxf", "image/vnd.dxf");
        contentType.put(".e", "text/x-eiffel");
        contentType.put(".egon", "application/x-egon");
        contentType.put(".eif", "text/x-eiffel");
        contentType.put(".el", "text/x-emacs-lisp");
        contentType.put(".emf", "image/x-emf");
        contentType.put(".emp", "application/vnd.emusic-emusic_package");
        contentType.put(".ent", "application/xml-external-parsed-entity");
        contentType.put(".eps", "image/x-eps");
        contentType.put(".eps.bz2", "image/x-bzeps");
        contentType.put(".eps.gz", "image/x-gzeps");
        contentType.put(".epsf", "image/x-eps");
        contentType.put(".epsf.bz2", "image/x-bzeps");
        contentType.put(".epsf.gz", "image/x-gzeps");
        contentType.put(".epsi", "image/x-eps");
        contentType.put(".epsi.bz2", "image/x-bzeps");
        contentType.put(".epsi.gz", "image/x-gzeps");
        contentType.put(".epub", "application/epub+zip");
        contentType.put(".erl", "text/x-erlang");
        contentType.put(".es", "application/ecmascript");
        contentType.put(".etheme", "application/x-e-theme");
        contentType.put(".etx", "text/x-setext");
        contentType.put(".exe", "application/x-ms-dos-executable");
        contentType.put(".exr", "image/x-exr");
        contentType.put(".ez", "application/andrew-inset");
        contentType.put(".f", "text/x-fortran");
        contentType.put(".f90", "text/x-fortran");
        contentType.put(".f95", "text/x-fortran");
        contentType.put(".fb2", "application/x-fictionbook+xml");
        contentType.put(".fig", "image/x-xfig");
        contentType.put(".fits", "image/fits");
        contentType.put(".fl", "application/x-fluid");
        contentType.put(".flac", "audio/x-flac");
        contentType.put(".flc", "video/x-flic");
        contentType.put(".fli", "video/x-flic");
        contentType.put(".flv", "video/x-flv");
        contentType.put(".flw", "application/x-kivio");
        contentType.put(".fo", "text/x-xslfo");
        contentType.put(".for", "text/x-fortran");
        contentType.put(".g3", "image/fax-g3");
        contentType.put(".gb", "application/x-gameboy-rom");
        contentType.put(".gba", "application/x-gba-rom");
        contentType.put(".gcrd", "text/directory");
        contentType.put(".ged", "application/x-gedcom");
        contentType.put(".gedcom", "application/x-gedcom");
        contentType.put(".gen", "application/x-genesis-rom");
        contentType.put(".gf", "application/x-tex-gf");
        contentType.put(".gg", "application/x-sms-rom");
        contentType.put(".gif", "image/gif");
        contentType.put(".glade", "application/x-glade");
        contentType.put(".gmo", "application/x-gettext-translation");
        contentType.put(".gnc", "application/x-gnucash");
        contentType.put(".gnd", "application/gnunet-directory");
        contentType.put(".gnucash", "application/x-gnucash");
        contentType.put(".gnumeric", "application/x-gnumeric");
        contentType.put(".gnuplot", "application/x-gnuplot");
        contentType.put(".gp", "application/x-gnuplot");
        contentType.put(".gpg", "application/pgp-encrypted");
        contentType.put(".gplt", "application/x-gnuplot");
        contentType.put(".gra", "application/x-graphite");
        contentType.put(".gsf", "application/x-font-type1");
        contentType.put(".gsm", "audio/x-gsm");
        contentType.put(".gtar", "application/x-tar");
        contentType.put(".gv", "text/vnd.graphviz");
        contentType.put(".gvp", "text/x-google-video-pointer");
        contentType.put(".gz", "application/x-gzip");
        contentType.put(".h", "text/x-chdr");
        contentType.put(".h++", "text/x-c++hdr");
        contentType.put(".hdf", "application/x-hdf");
        contentType.put(".hh", "text/x-c++hdr");
        contentType.put(".hp", "text/x-c++hdr");
        contentType.put(".hpgl", "application/vnd.hp-hpgl");
        contentType.put(".hpp", "text/x-c++hdr");
        contentType.put(".hs", "text/x-haskell");
        contentType.put(".htm", "text/html");
        contentType.put(".html", "text/html");
        contentType.put(".hwp", "application/x-hwp");
        contentType.put(".hwt", "application/x-hwt");
        contentType.put(".hxx", "text/x-c++hdr");
        contentType.put(".ica", "application/x-ica");
        contentType.put(".icb", "image/x-tga");
        contentType.put(".icns", "image/x-icns");
        contentType.put(".ico", "image/vnd.microsoft.icon");
        contentType.put(".ics", "text/calendar");
        contentType.put(".idl", "text/x-idl");
        contentType.put(".ief", "image/ief");
        contentType.put(".iff", "image/x-iff");
        contentType.put(".ilbm", "image/x-ilbm");
        contentType.put(".ime", "text/x-imelody");
        contentType.put(".imy", "text/x-imelody");
        contentType.put(".ins", "text/x-tex");
        contentType.put(".iptables", "text/x-iptables");
        contentType.put(".iso", "application/x-cd-image");
        contentType.put(".iso9660", "application/x-cd-image");
        contentType.put(".it", "audio/x-it");
        contentType.put(".j2k", "image/jp2");
        contentType.put(".jad", "text/vnd.sun.j2me.app-descriptor");
        contentType.put(".jar", "application/x-java-archive");
        contentType.put(".java", "text/x-java");
        contentType.put(".jng", "image/x-jng");
        contentType.put(".jnlp", "application/x-java-jnlp-file");
        contentType.put(".jp2", "image/jp2");
        contentType.put(".jpc", "image/jp2");
        contentType.put(".jpe", "image/jpeg");
        contentType.put(".jpeg", "image/jpeg");
        contentType.put(".jpf", "image/jp2");
        contentType.put(".jpg", "image/jpeg");
        contentType.put(".jpr", "application/x-jbuilder-project");
        contentType.put(".jpx", "image/jp2");
        contentType.put(".js", "application/javascript");
        contentType.put(".json", "application/json");
        contentType.put(".jsonp", "application/jsonp");
        contentType.put(".k25", "image/x-kodak-k25");
        contentType.put(".kar", "audio/midi");
        contentType.put(".karbon", "application/x-karbon");
        contentType.put(".kdc", "image/x-kodak-kdc");
        contentType.put(".kdelnk", "application/x-desktop");
        contentType.put(".kexi", "application/x-kexiproject-sqlite3");
        contentType.put(".kexic", "application/x-kexi-connectiondata");
        contentType.put(".kexis", "application/x-kexiproject-shortcut");
        contentType.put(".kfo", "application/x-kformula");
        contentType.put(".kil", "application/x-killustrator");
        contentType.put(".kino", "application/smil");
        contentType.put(".kml", "application/vnd.google-earth.kml+xml");
        contentType.put(".kmz", "application/vnd.google-earth.kmz");
        contentType.put(".kon", "application/x-kontour");
        contentType.put(".kpm", "application/x-kpovmodeler");
        contentType.put(".kpr", "application/x-kpresenter");
        contentType.put(".kpt", "application/x-kpresenter");
        contentType.put(".kra", "application/x-krita");
        contentType.put(".ksp", "application/x-kspread");
        contentType.put(".kud", "application/x-kugar");
        contentType.put(".kwd", "application/x-kword");
        contentType.put(".kwt", "application/x-kword");
        contentType.put(".la", "application/x-shared-library-la");
        contentType.put(".latex", "text/x-tex");
        contentType.put(".ldif", "text/x-ldif");
        contentType.put(".lha", "application/x-lha");
        contentType.put(".lhs", "text/x-literate-haskell");
        contentType.put(".lhz", "application/x-lhz");
        contentType.put(".log", "text/x-log");
        contentType.put(".ltx", "text/x-tex");
        contentType.put(".lua", "text/x-lua");
        contentType.put(".lwo", "image/x-lwo");
        contentType.put(".lwob", "image/x-lwo");
        contentType.put(".lws", "image/x-lws");
        contentType.put(".ly", "text/x-lilypond");
        contentType.put(".lyx", "application/x-lyx");
        contentType.put(".lz", "application/x-lzip");
        contentType.put(".lzh", "application/x-lha");
        contentType.put(".lzma", "application/x-lzma");
        contentType.put(".lzo", "application/x-lzop");
        contentType.put(".m", "text/x-matlab");
        contentType.put(".m15", "audio/x-mod");
        contentType.put(".m2t", "video/mpeg");
        contentType.put(".m3u", "audio/x-mpegurl");
        contentType.put(".m3u8", "audio/x-mpegurl");
        contentType.put(".m4", "application/x-m4");
        contentType.put(".m4a", "audio/mp4");
        contentType.put(".m4b", "audio/x-m4b");
        contentType.put(".m4v", "video/mp4");
        contentType.put(".mab", "application/x-markaby");
        contentType.put(".man", "application/x-troff-man");
        contentType.put(".mbox", "application/mbox");
        contentType.put(".md", "application/x-genesis-rom");
        contentType.put(".mdb", "application/vnd.ms-access");
        contentType.put(".mdi", "image/vnd.ms-modi");
        contentType.put(".me", "text/x-troff-me");
        contentType.put(".med", "audio/x-mod");
        contentType.put(".metalink", "application/metalink+xml");
        contentType.put(".mgp", "application/x-magicpoint");
        contentType.put(".mid", "audio/midi");
        contentType.put(".midi", "audio/midi");
        contentType.put(".mif", "application/x-mif");
        contentType.put(".minipsf", "audio/x-minipsf");
        contentType.put(".mka", "audio/x-matroska");
        contentType.put(".mkv", "video/x-matroska");
        contentType.put(".ml", "text/x-ocaml");
        contentType.put(".mli", "text/x-ocaml");
        contentType.put(".mm", "text/x-troff-mm");
        contentType.put(".mmf", "application/x-smaf");
        contentType.put(".mml", "text/mathml");
        contentType.put(".mng", "video/x-mng");
        contentType.put(".mo", "application/x-gettext-translation");
        contentType.put(".mo3", "audio/x-mo3");
        contentType.put(".moc", "text/x-moc");
        contentType.put(".mod", "audio/x-mod");
        contentType.put(".mof", "text/x-mof");
        contentType.put(".moov", "video/quicktime");
        contentType.put(".mov", "video/quicktime");
        contentType.put(".movie", "video/x-sgi-movie");
        contentType.put(".mp+", "audio/x-musepack");
        contentType.put(".mp2", "video/mpeg");
        contentType.put(".mp3", "audio/mpeg");
        contentType.put(".mp4", "video/mp4");
        contentType.put(".mpc", "audio/x-musepack");
        contentType.put(".mpe", "video/mpeg");
        contentType.put(".mpeg", "video/mpeg");
        contentType.put(".mpg", "video/mpeg");
        contentType.put(".mpga", "audio/mpeg");
        contentType.put(".mpp", "audio/x-musepack");
        contentType.put(".mrl", "text/x-mrml");
        contentType.put(".mrml", "text/x-mrml");
        contentType.put(".mrw", "image/x-minolta-mrw");
        contentType.put(".ms", "text/x-troff-ms");
        contentType.put(".msi", "application/x-msi");
        contentType.put(".msod", "image/x-msod");
        contentType.put(".msx", "application/x-msx-rom");
        contentType.put(".mtm", "audio/x-mod");
        contentType.put(".mup", "text/x-mup");
        contentType.put(".mxf", "application/mxf");
        contentType.put(".n64", "application/x-n64-rom");
        contentType.put(".nb", "application/mathematica");
        contentType.put(".nc", "application/x-netcdf");
        contentType.put(".nds", "application/x-nintendo-ds-rom");
        contentType.put(".nef", "image/x-nikon-nef");
        contentType.put(".nes", "application/x-nes-rom");
        contentType.put(".nfo", "text/x-nfo");
        contentType.put(".not", "text/x-mup");
        contentType.put(".nsc", "application/x-netshow-channel");
        contentType.put(".nsv", "video/x-nsv");
        contentType.put(".o", "application/x-object");
        contentType.put(".obj", "application/x-tgif");
        contentType.put(".ocl", "text/x-ocl");
        contentType.put(".oda", "application/oda");
        contentType.put(".odb", "application/vnd.oasis.opendocument.database");
        contentType.put(".odc", "application/vnd.oasis.opendocument.chart");
        contentType.put(".odf", "application/vnd.oasis.opendocument.formula");
        contentType.put(".odg", "application/vnd.oasis.opendocument.graphics");
        contentType.put(".odi", "application/vnd.oasis.opendocument.image");
        contentType.put(".odm", "application/vnd.oasis.opendocument.text-master");
        contentType.put(".odp", "application/vnd.oasis.opendocument.presentation");
        contentType.put(".ods", "application/vnd.oasis.opendocument.spreadsheet");
        contentType.put(".odt", "application/vnd.oasis.opendocument.text");
        contentType.put(".oga", "audio/ogg");
        contentType.put(".ogg", "video/x-theora+ogg");
        contentType.put(".ogm", "video/x-ogm+ogg");
        contentType.put(".ogv", "video/ogg");
        contentType.put(".ogx", "application/ogg");
        contentType.put(".old", "application/x-trash");
        contentType.put(".oleo", "application/x-oleo");
        contentType.put(".opml", "text/x-opml+xml");
        contentType.put(".ora", "image/openraster");
        contentType.put(".orf", "image/x-olympus-orf");
        contentType.put(".otc", "application/vnd.oasis.opendocument.chart-template");
        contentType.put(".otf", "application/x-font-otf");
        contentType.put(".otg", "application/vnd.oasis.opendocument.graphics-template");
        contentType.put(".oth", "application/vnd.oasis.opendocument.text-web");
        contentType.put(".otp", "application/vnd.oasis.opendocument.presentation-template");
        contentType.put(".ots", "application/vnd.oasis.opendocument.spreadsheet-template");
        contentType.put(".ott", "application/vnd.oasis.opendocument.text-template");
        contentType.put(".owl", "application/rdf+xml");
        contentType.put(".oxt", "application/vnd.openofficeorg.extension");
        contentType.put(".p", "text/x-pascal");
        contentType.put(".p10", "application/pkcs10");
        contentType.put(".p12", "application/x-pkcs12");
        contentType.put(".p7b", "application/x-pkcs7-certificates");
        contentType.put(".p7s", "application/pkcs7-signature");
        contentType.put(".pack", "application/x-java-pack200");
        contentType.put(".pak", "application/x-pak");
        contentType.put(".par2", "application/x-par2");
        contentType.put(".pas", "text/x-pascal");
        contentType.put(".patch", "text/x-patch");
        contentType.put(".pbm", "image/x-portable-bitmap");
        contentType.put(".pcd", "image/x-photo-cd");
        contentType.put(".pcf", "application/x-cisco-vpn-settings");
        contentType.put(".pcf.gz", "application/x-font-pcf");
        contentType.put(".pcf.z", "application/x-font-pcf");
        contentType.put(".pcl", "application/vnd.hp-pcl");
        contentType.put(".pcx", "image/x-pcx");
        contentType.put(".pdb", "chemical/x-pdb");
        contentType.put(".pdc", "application/x-aportisdoc");
        contentType.put(".pdf", "application/pdf");
        contentType.put(".pdf.bz2", "application/x-bzpdf");
        contentType.put(".pdf.gz", "application/x-gzpdf");
        contentType.put(".pef", "image/x-pentax-pef");
        contentType.put(".pem", "application/x-x509-ca-cert");
        contentType.put(".perl", "application/x-perl");
        contentType.put(".pfa", "application/x-font-type1");
        contentType.put(".pfb", "application/x-font-type1");
        contentType.put(".pfx", "application/x-pkcs12");
        contentType.put(".pgm", "image/x-portable-graymap");
        contentType.put(".pgn", "application/x-chess-pgn");
        contentType.put(".pgp", "application/pgp-encrypted");
        contentType.put(".php", "application/x-php");
        contentType.put(".php3", "application/x-php");
        contentType.put(".php4", "application/x-php");
        contentType.put(".pict", "image/x-pict");
        contentType.put(".pict1", "image/x-pict");
        contentType.put(".pict2", "image/x-pict");
        contentType.put(".pickle", "application/python-pickle");
        contentType.put(".pk", "application/x-tex-pk");
        contentType.put(".pkipath", "application/pkix-pkipath");
        contentType.put(".pkr", "application/pgp-keys");
        contentType.put(".pl", "application/x-perl");
        contentType.put(".pla", "audio/x-iriver-pla");
        contentType.put(".pln", "application/x-planperfect");
        contentType.put(".pls", "audio/x-scpls");
        contentType.put(".pm", "application/x-perl");
        contentType.put(".png", "image/png");
        contentType.put(".pnm", "image/x-portable-anymap");
        contentType.put(".pntg", "image/x-macpaint");
        contentType.put(".po", "text/x-gettext-translation");
        contentType.put(".por", "application/x-spss-por");
        contentType.put(".pot", "text/x-gettext-translation-template");
        contentType.put(".ppm", "image/x-portable-pixmap");
        contentType.put(".pps", "application/vnd.ms-powerpoint");
        contentType.put(".ppt", "application/vnd.ms-powerpoint");
        contentType.put(".pptm", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
        contentType.put(".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
        contentType.put(".ppz", "application/vnd.ms-powerpoint");
        contentType.put(".prc", "application/x-palm-database");
        contentType.put(".ps", "application/postscript");
        contentType.put(".ps.bz2", "application/x-bzpostscript");
        contentType.put(".ps.gz", "application/x-gzpostscript");
        contentType.put(".psd", "image/vnd.adobe.photoshop");
        contentType.put(".psf", "audio/x-psf");
        contentType.put(".psf.gz", "application/x-gz-font-linux-psf");
        contentType.put(".psflib", "audio/x-psflib");
        contentType.put(".psid", "audio/prs.sid");
        contentType.put(".psw", "application/x-pocket-word");
        contentType.put(".pw", "application/x-pw");
        contentType.put(".py", "text/x-python");
        contentType.put(".pyc", "application/x-python-bytecode");
        contentType.put(".pyo", "application/x-python-bytecode");
        contentType.put(".qif", "image/x-quicktime");
        contentType.put(".qt", "video/quicktime");
        contentType.put(".qtif", "image/x-quicktime");
        contentType.put(".qtl", "application/x-quicktime-media-link");
        contentType.put(".qtvr", "video/quicktime");
        contentType.put(".ra", "audio/vnd.rn-realaudio");
        contentType.put(".raf", "image/x-fuji-raf");
        contentType.put(".ram", "application/ram");
        contentType.put(".rar", "application/x-rar");
        contentType.put(".ras", "image/x-cmu-raster");
        contentType.put(".raw", "image/x-panasonic-raw");
        contentType.put(".rax", "audio/vnd.rn-realaudio");
        contentType.put(".rb", "application/x-ruby");
        contentType.put(".rdf", "application/rdf+xml");
        contentType.put(".rdfs", "application/rdf+xml");
        contentType.put(".reg", "text/x-ms-regedit");
        contentType.put(".rej", "application/x-reject");
        contentType.put(".rgb", "image/x-rgb");
        contentType.put(".rle", "image/rle");
        contentType.put(".rm", "application/vnd.rn-realmedia");
        contentType.put(".rmj", "application/vnd.rn-realmedia");
        contentType.put(".rmm", "application/vnd.rn-realmedia");
        contentType.put(".rms", "application/vnd.rn-realmedia");
        contentType.put(".rmvb", "application/vnd.rn-realmedia");
        contentType.put(".rmx", "application/vnd.rn-realmedia");
        contentType.put(".roff", "text/troff");
        contentType.put(".rp", "image/vnd.rn-realpix");
        contentType.put(".rpm", "application/x-rpm");
        contentType.put(".rss", "application/rss+xml");
        contentType.put(".rt", "text/vnd.rn-realtext");
        contentType.put(".rtf", "application/rtf");
        contentType.put(".rtx", "text/richtext");
        contentType.put(".rv", "video/vnd.rn-realvideo");
        contentType.put(".rvx", "video/vnd.rn-realvideo");
        contentType.put(".s3m", "audio/x-s3m");
        contentType.put(".sam", "application/x-amipro");
        contentType.put(".sami", "application/x-sami");
        contentType.put(".sav", "application/x-spss-sav");
        contentType.put(".scm", "text/x-scheme");
        contentType.put(".sda", "application/vnd.stardivision.draw");
        contentType.put(".sdc", "application/vnd.stardivision.calc");
        contentType.put(".sdd", "application/vnd.stardivision.impress");
        contentType.put(".sdp", "application/sdp");
        contentType.put(".sds", "application/vnd.stardivision.chart");
        contentType.put(".sdw", "application/vnd.stardivision.writer");
        contentType.put(".sgf", "application/x-go-sgf");
        contentType.put(".sgi", "image/x-sgi");
        contentType.put(".sgl", "application/vnd.stardivision.writer");
        contentType.put(".sgm", "text/sgml");
        contentType.put(".sgml", "text/sgml");
        contentType.put(".sh", "application/x-shellscript");
        contentType.put(".shar", "application/x-shar");
        contentType.put(".shn", "application/x-shorten");
        contentType.put(".siag", "application/x-siag");
        contentType.put(".sid", "audio/prs.sid");
        contentType.put(".sik", "application/x-trash");
        contentType.put(".sis", "application/vnd.symbian.install");
        contentType.put(".sisx", "x-epoc/x-sisx-app");
        contentType.put(".sit", "application/x-stuffit");
        contentType.put(".siv", "application/sieve");
        contentType.put(".sk", "image/x-skencil");
        contentType.put(".sk1", "image/x-skencil");
        contentType.put(".skr", "application/pgp-keys");
        contentType.put(".slk", "text/spreadsheet");
        contentType.put(".smaf", "application/x-smaf");
        contentType.put(".smc", "application/x-snes-rom");
        contentType.put(".smd", "application/vnd.stardivision.mail");
        contentType.put(".smf", "application/vnd.stardivision.math");
        contentType.put(".smi", "application/x-sami");
        contentType.put(".smil", "application/smil");
        contentType.put(".sml", "application/smil");
        contentType.put(".sms", "application/x-sms-rom");
        contentType.put(".snd", "audio/basic");
        contentType.put(".so", "application/x-sharedlib");
        contentType.put(".spc", "application/x-pkcs7-certificates");
        contentType.put(".spd", "application/x-font-speedo");
        contentType.put(".spec", "text/x-rpm-spec");
        contentType.put(".spl", "application/x-shockwave-flash");
        contentType.put(".spx", "audio/x-speex");
        contentType.put(".sql", "text/x-sql");
        contentType.put(".sr2", "image/x-sony-sr2");
        contentType.put(".src", "application/x-wais-source");
        contentType.put(".srf", "image/x-sony-srf");
        contentType.put(".srt", "application/x-subrip");
        contentType.put(".ssa", "text/x-ssa");
        contentType.put(".stc", "application/vnd.sun.xml.calc.template");
        contentType.put(".std", "application/vnd.sun.xml.draw.template");
        contentType.put(".sti", "application/vnd.sun.xml.impress.template");
        contentType.put(".stm", "audio/x-stm");
        contentType.put(".stw", "application/vnd.sun.xml.writer.template");
        contentType.put(".sty", "text/x-tex");
        contentType.put(".sub", "text/x-subviewer");
        contentType.put(".sun", "image/x-sun-raster");
        contentType.put(".sv4cpio", "application/x-sv4cpio");
        contentType.put(".sv4crc", "application/x-sv4crc");
        contentType.put(".svg", "image/svg+xml");
        contentType.put(".svgz", "image/svg+xml-compressed");
        contentType.put(".swf", "application/x-shockwave-flash");
        contentType.put(".sxc", "application/vnd.sun.xml.calc");
        contentType.put(".sxd", "application/vnd.sun.xml.draw");
        contentType.put(".sxg", "application/vnd.sun.xml.writer.global");
        contentType.put(".sxi", "application/vnd.sun.xml.impress");
        contentType.put(".sxm", "application/vnd.sun.xml.math");
        contentType.put(".sxw", "application/vnd.sun.xml.writer");
        contentType.put(".sylk", "text/spreadsheet");
        contentType.put(".t", "text/troff");
        contentType.put(".t2t", "text/x-txt2tags");
        contentType.put(".tar", "application/x-tar");
        contentType.put(".tar.bz", "application/x-bzip-compressed-tar");
        contentType.put(".tar.bz2", "application/x-bzip-compressed-tar");
        contentType.put(".tar.gz", "application/x-compressed-tar");
        contentType.put(".tar.lzma", "application/x-lzma-compressed-tar");
        contentType.put(".tar.lzo", "application/x-tzo");
        contentType.put(".tar.xz", "application/x-xz-compressed-tar");
        contentType.put(".tar.z", "application/x-tarz");
        contentType.put(".tbz", "application/x-bzip-compressed-tar");
        contentType.put(".tbz2", "application/x-bzip-compressed-tar");
        contentType.put(".tcl", "text/x-tcl");
        contentType.put(".tex", "text/x-tex");
        contentType.put(".texi", "text/x-texinfo");
        contentType.put(".texinfo", "text/x-texinfo");
        contentType.put(".tga", "image/x-tga");
        contentType.put(".tgz", "application/x-compressed-tar");
        contentType.put(".theme", "application/x-theme");
        contentType.put(".themepack", "application/x-windows-themepack");
        contentType.put(".tif", "image/tiff");
        contentType.put(".tiff", "image/tiff");
        contentType.put(".tk", "text/x-tcl");
        contentType.put(".tlz", "application/x-lzma-compressed-tar");
        contentType.put(".tnef", "application/vnd.ms-tnef");
        contentType.put(".tnf", "application/vnd.ms-tnef");
        contentType.put(".toc", "application/x-cdrdao-toc");
        contentType.put(".torrent", "application/x-bittorrent");
        contentType.put(".tpic", "image/x-tga");
        contentType.put(".tr", "text/troff");
        contentType.put(".ts", "application/x-linguist");
        contentType.put(".tsv", "text/tab-separated-values");
        contentType.put(".tta", "audio/x-tta");
        contentType.put(".ttc", "application/x-font-ttf");
        contentType.put(".ttf", "application/x-font-ttf");
        contentType.put(".ttx", "application/x-font-ttx");
        contentType.put(".txt", "text/plain");
        contentType.put(".txz", "application/x-xz-compressed-tar");
        contentType.put(".tzo", "application/x-tzo");
        contentType.put(".ufraw", "application/x-ufraw");
        contentType.put(".ui", "application/x-designer");
        contentType.put(".uil", "text/x-uil");
        contentType.put(".ult", "audio/x-mod");
        contentType.put(".uni", "audio/x-mod");
        contentType.put(".uri", "text/x-uri");
        contentType.put(".url", "text/x-uri");
        contentType.put(".ustar", "application/x-ustar");
        contentType.put(".vala", "text/x-vala");
        contentType.put(".vapi", "text/x-vala");
        contentType.put(".vcf", "text/directory");
        contentType.put(".vcs", "text/calendar");
        contentType.put(".vct", "text/directory");
        contentType.put(".vda", "image/x-tga");
        contentType.put(".vhd", "text/x-vhdl");
        contentType.put(".vhdl", "text/x-vhdl");
        contentType.put(".viv", "video/vivo");
        contentType.put(".vivo", "video/vivo");
        contentType.put(".vlc", "audio/x-mpegurl");
        contentType.put(".vob", "video/mpeg");
        contentType.put(".voc", "audio/x-voc");
        contentType.put(".vor", "application/vnd.stardivision.writer");
        contentType.put(".vst", "image/x-tga");
        contentType.put(".wav", "audio/x-wav");
        contentType.put(".wax", "audio/x-ms-asx");
        contentType.put(".wb1", "application/x-quattropro");
        contentType.put(".wb2", "application/x-quattropro");
        contentType.put(".wb3", "application/x-quattropro");
        contentType.put(".wbmp", "image/vnd.wap.wbmp");
        contentType.put(".wcm", "application/vnd.ms-works");
        contentType.put(".wdb", "application/vnd.ms-works");
        contentType.put(".webm", "video/webm");
        contentType.put(".wk1", "application/vnd.lotus-1-2-3");
        contentType.put(".wk3", "application/vnd.lotus-1-2-3");
        contentType.put(".wk4", "application/vnd.lotus-1-2-3");
        contentType.put(".wks", "application/vnd.ms-works");
        contentType.put(".wma", "audio/x-ms-wma");
        contentType.put(".wmf", "image/x-wmf");
        contentType.put(".wml", "text/vnd.wap.wml");
        contentType.put(".wmls", "text/vnd.wap.wmlscript");
        contentType.put(".wmv", "video/x-ms-wmv");
        contentType.put(".wmx", "audio/x-ms-asx");
        contentType.put(".wp", "application/vnd.wordperfect");
        contentType.put(".wp4", "application/vnd.wordperfect");
        contentType.put(".wp5", "application/vnd.wordperfect");
        contentType.put(".wp6", "application/vnd.wordperfect");
        contentType.put(".wpd", "application/vnd.wordperfect");
        contentType.put(".wpg", "application/x-wpg");
        contentType.put(".wpl", "application/vnd.ms-wpl");
        contentType.put(".wpp", "application/vnd.wordperfect");
        contentType.put(".wps", "application/vnd.ms-works");
        contentType.put(".wri", "application/x-mswrite");
        contentType.put(".wrl", "model/vrml");
        contentType.put(".wv", "audio/x-wavpack");
        contentType.put(".wvc", "audio/x-wavpack-correction");
        contentType.put(".wvp", "audio/x-wavpack");
        contentType.put(".wvx", "audio/x-ms-asx");
        contentType.put(".x3f", "image/x-sigma-x3f");
        contentType.put(".xac", "application/x-gnucash");
        contentType.put(".xbel", "application/x-xbel");
        contentType.put(".xbl", "application/xml");
        contentType.put(".xbm", "image/x-xbitmap");
        contentType.put(".xcf", "image/x-xcf");
        contentType.put(".xcf.bz2", "image/x-compressed-xcf");
        contentType.put(".xcf.gz", "image/x-compressed-xcf");
        contentType.put(".xhtml", "application/xhtml+xml");
        contentType.put(".xi", "audio/x-xi");
        contentType.put(".xla", "application/vnd.ms-excel");
        contentType.put(".xlc", "application/vnd.ms-excel");
        contentType.put(".xld", "application/vnd.ms-excel");
        contentType.put(".xlf", "application/x-xliff");
        contentType.put(".xliff", "application/x-xliff");
        contentType.put(".xll", "application/vnd.ms-excel");
        contentType.put(".xlm", "application/vnd.ms-excel");
        contentType.put(".xls", "application/vnd.ms-excel");
        contentType.put(".xlsm", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        contentType.put(".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        contentType.put(".xlt", "application/vnd.ms-excel");
        contentType.put(".xlw", "application/vnd.ms-excel");
        contentType.put(".xm", "audio/x-xm");
        contentType.put(".xmf", "audio/x-xmf");
        contentType.put(".xmi", "text/x-xmi");
        contentType.put(".xml", "application/xml");
        contentType.put(".xpm", "image/x-xpixmap");
        contentType.put(".xps", "application/vnd.ms-xpsdocument");
        contentType.put(".xsl", "application/xml");
        contentType.put(".xslfo", "text/x-xslfo");
        contentType.put(".xslt", "application/xml");
        contentType.put(".xspf", "application/xspf+xml");
        contentType.put(".xul", "application/vnd.mozilla.xul+xml");
        contentType.put(".xwd", "image/x-xwindowdump");
        contentType.put(".xyz", "chemical/x-pdb");
        contentType.put(".xz", "application/x-xz");
        contentType.put(".w2p", "application/w2p");
        contentType.put(".z", "application/x-compress");
        contentType.put(".zabw", "application/x-abiword");
        contentType.put(".zip", "application/zip");
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值