package com.lucifer.rnmail;


import android.annotation.SuppressLint;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Base64;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Array;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.activation.CommandMap;
import javax.activation.MailcapCommandMap;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;

import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeArray;
import com.facebook.react.bridge.WritableNativeMap;


@SuppressLint("DefaultLocale")

public class ReciveOneMail {

    private MimeMessage mimeMessage = null;
    private String saveAttachPath = ""; // 附件下载后的存放目录
    private StringBuffer bodytext = new StringBuffer();// 存放邮件内容
    private String dateformat = "yy-MM-dd HH:mm"; // 默认的日前显示格式
    private String fromaddress = ""; //发件人 统一转成小写
    private String toaddresss = ""; //接受者   统一转成小写
    private String ccaddresss = ""; //抄送    统一转成小写
    private String bccaddresss = ""; //暗送   统一转成小写
    private WritableArray contentArray = new WritableNativeArray();
    private WritableArray attachsArray = new WritableNativeArray();
    private Map<String, String> atachmentsmap = new HashMap<String, String>();
    private StringBuffer mailTextContent = new StringBuffer();// 文字邮件内容
    private StringBuffer mailHtmlContent = new StringBuffer();// 网页邮件内容


    public ReciveOneMail(MimeMessage mimeMessage) {
        this.mimeMessage = mimeMessage;
    }

    public void setMimeMessage(MimeMessage mimeMessage) {
        this.mimeMessage = mimeMessage;
    }


    /**
     * 获得发件人的地址和姓名
     */
    public String getFromAddress() throws Exception {
        return fromaddress;
    }

    /**
     * 获得发件人的地址和姓名
     */
    public String getFrom() throws Exception {
        InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();
        String from = address[0].getAddress();
        if (from == null)
            from = "";
        String personal = address[0].getPersonal();
        if (personal == null)
            personal = "";
        String fromaddr = personal + "<" + from + ">";
        fromaddress = from.toLowerCase();
        return fromaddr;
    }

    /**
     * 获得邮件的收件人，抄送，和密送的地址和姓名，根据所传递的参数的不同 "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址
     */
    @SuppressLint("DefaultLocale")
    public String getMailAddress(String type) throws Exception {
        String mailaddr = "";
        String addtype = type.toUpperCase();
        InternetAddress[] address = null;
        if (addtype.equals("TO") || addtype.equals("CC")
                || addtype.equals("BCC")) {
            if (addtype.equals("TO")) {
                address = (InternetAddress[]) mimeMessage
                        .getRecipients(Message.RecipientType.TO);
                if (address != null) {
                    for (int i = 0; i < address.length; i++) {
                        String email = address[i].getAddress();
                        if (email == null)
                            email = "";
                        else {
                            email = MimeUtility.decodeText(email);
                        }
                        String personal = address[i].getPersonal();
                        if (personal == null)
                            personal = "";
                        else {
                            personal = MimeUtility.decodeText(personal);
                        }
                        String compositeto = personal + "<" + email + ">";
                        mailaddr += "," + compositeto;
                        toaddresss += "," + email.toLowerCase();
                        toaddresss = toaddresss.substring(1);
                    }
                    mailaddr = mailaddr.substring(1);
                }
            } else if (addtype.equals("CC")) {
                address = (InternetAddress[]) mimeMessage
                        .getRecipients(Message.RecipientType.CC);
                if (address != null) {
                    for (int i = 0; i < address.length; i++) {
                        String email = address[i].getAddress();
                        if (email == null)
                            email = "";
                        else {
                            email = MimeUtility.decodeText(email);
                        }
                        String personal = address[i].getPersonal();
                        if (personal == null)
                            personal = "";
                        else {
                            personal = MimeUtility.decodeText(personal);
                        }
                        String compositeto = personal + "<" + email + ">";
                        mailaddr += "," + compositeto;
                        ccaddresss += "," + email.toLowerCase();
                        ccaddresss = ccaddresss.substring(1);
                    }
                    mailaddr = mailaddr.substring(1);

                }
            } else {
                address = (InternetAddress[]) mimeMessage
                        .getRecipients(Message.RecipientType.BCC);
                if (address != null) {
                    for (int i = 0; i < address.length; i++) {
                        String email = address[i].getAddress();
                        if (email == null)
                            email = "";
                        else {
                            email = MimeUtility.decodeText(email);
                        }
                        String personal = address[i].getPersonal();
                        if (personal == null)
                            personal = "";
                        else {
                            personal = MimeUtility.decodeText(personal);
                        }
                        String compositeto = personal + "<" + email + ">";
                        mailaddr += "," + compositeto;
                        bccaddresss += "," + email.toLowerCase();
                        bccaddresss = bccaddresss.substring(1);
                    }
                    mailaddr = mailaddr.substring(1);
                }
            }
        } else {
            throw new Exception("Error emailaddr type!");
        }
        return mailaddr;
    }


    /**
     * 获得邮件的收件人，抄送，和密送的地址和姓名，根据所传递的参数的不同 "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址
     */
    @SuppressLint("DefaultLocale")
    public String getOnlyMailAddress(String type) throws Exception {
        String addtype = type.toUpperCase();
        InternetAddress[] address = null;
        if (addtype.equals("TO") || addtype.equals("CC")
                || addtype.equals("BCC")) {
            if (addtype.equals("TO")) {
                return toaddresss;
            } else if (addtype.equals("CC")) {
                return ccaddresss;
            } else {
                return bccaddresss;
            }
        } else {
            throw new Exception("Error emailaddr type!");
        }
    }

    /**
     * 获得邮件主题
     */
    public String getSubject() throws MessagingException {
        String subject = "";
        try {
            subject = MimeUtility.decodeText(mimeMessage.getSubject());
            if (subject == null)
                subject = "";
        } catch (Exception exce) {
        }
        return subject;
    }

    /**
     * 获得邮件发送日期
     */
    @SuppressLint("SimpleDateFormat")
    public String getSentDate() throws Exception {
        Date sentdate = mimeMessage.getSentDate();
        SimpleDateFormat format = new SimpleDateFormat(dateformat);
        return format.format(sentdate);
    }

    /**
     * 获得邮件正文内容数组
     */
    public WritableArray getBodyArray() {
        return contentArray;
    }

    /**
     * 获得邮件正文内容
     */
    public String getBodyText() {
        return bodytext.toString();
    }

    /**
     * 解析邮件，把得到的邮件内容保存到一个StringBuffer对象中，解析邮件 主要是根据MimeType类型的不同执行不同的操作，一步一步的解析
     */
    public void getMailContent(Part part) throws Exception {

        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);

        saveAttachMent(part);
        parserMailContent(part);

        String content = mailTextContent.toString();
        String htmlcontent = mailHtmlContent.toString();

        for (String contentId : atachmentsmap.keySet()) {
            String replacedText = "" + contentId.replace("<", "").replace(">", "");
            htmlcontent = replaceLocalPathByImgCid(htmlcontent, replacedText, atachmentsmap.get(contentId));

//            htmlcontent = htmlcontent.replace(replacedText, atachmentsmap.get(contentId));
        }

        if(!content.isEmpty()){
            WritableMap typemap = new WritableNativeMap();
            typemap.putString("type", "text");
            typemap.putString("content", content);
            contentArray.pushMap(typemap);
        }

        if(!htmlcontent.isEmpty()){
            WritableMap htmlmap = new WritableNativeMap();
            htmlmap.putString("type", "html");
            htmlmap.putString("content", htmlcontent);
            contentArray.pushMap(htmlmap);
        }

        mailTextContent.setLength(0);
        mailHtmlContent.setLength(0);


//        String contenttype = part.getContentType();
//        int nameindex = contenttype.indexOf("name");
//        boolean conname = false;
//        if (nameindex != -1)
//            conname = true;
//        System.out.println("CONTENTTYPE: " + contenttype);
//
//        WritableMap typemap = new WritableNativeMap();
//
//        if (part.isMimeType("text/plain") && !conname) {
//            bodytext.append((String) part.getContent());
//            typemap.putString("type", "text");
//            typemap.putString("content", (String) part.getContent());
//            contentArray.pushMap(typemap);
//
//        } else if (part.isMimeType("text/html") && !conname) {
//            String content = (String) part.getContent();
//            bodytext.append(content);
//            typemap.putString("type", "html");
//            typemap.putString("content", content);
//            contentArray.pushMap(typemap);
//
//        } else if (part.isMimeType("multipart/*")) {
//            Multipart multipart = (Multipart) part.getContent();
//            int counts = multipart.getCount();
//            for (int i = 0; i < counts; i++) {
//                getMailContent(multipart.getBodyPart(i));
//            }
//        } else if (part.isMimeType("message/rfc822")) {
//            getMailContent((Part) part.getContent());
//        } else {
//        }
    }


    /**
     * 解析邮件内容，解析邮件 主要是根据MimeType类型的不同执行不同的操作，一步一步的解析
     */
    private void parserMailContent(Part part) throws Exception {

        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);

        String contentType = part.getContentType();
        int nameIndex = contentType.indexOf("name");
        boolean conName = false;
        if (nameIndex != -1) conName = true;

        if (part.isMimeType("multipart/alternative") && !conName) {
            Multipart mp = (Multipart) part.getContent();
            int bodynum = mp.getCount();
            for (int j = 0; j < bodynum; j++) {
                if (mp.getBodyPart(j).isMimeType("text/html")) {
                    mailHtmlContent.append(mp.getBodyPart(j).getContent().toString());
                }
            }
        } else if (part.isMimeType("text/plain") && !conName) {
            mailTextContent.append(part.getContent().toString());
        } else if (part.isMimeType("text/html") && !conName) {
            mailHtmlContent.append(part.getContent().toString());
        } else if (part.isMimeType("multipart/*")) {
            Multipart multipart = (Multipart) part.getContent();
            int counts = multipart.getCount();
            for (int i = 0; i < counts; i++) {
                parserMailContent(multipart.getBodyPart(i));
            }
        } else if (part.isMimeType("message/rfc822")) {
            parserMailContent((Part) part.getContent());
        }


    }


    /**
     * 判断此邮件是否需要回执，如果需要回执返回"true",否则返回"false"
     */
    public boolean getReplySign() throws MessagingException {
        boolean replysign = false;
        String needreply[] = mimeMessage
                .getHeader("Disposition-Notification-To");
        if (needreply != null) {
            replysign = true;
        }
        return replysign;
    }

    /**
     * 获得此邮件的Message-ID
     */
    public String getMessageId() throws MessagingException {
        return mimeMessage.getMessageID();
    }

    /**
     * 【判断此邮件是否已读，如果未读返回返回false,反之返回true】pop3协议使用时不能判断。
     */
    public boolean isNew() throws MessagingException {
        boolean isnew = false;//由于isnew设为false所以每次显示的都为未读
        Flags flags = ((Message) mimeMessage).getFlags();
        System.out.println("--------flags-------" + flags);
        Flags.Flag[] flag = flags.getSystemFlags();
        System.out.println("----flag----" + flag);
        System.out.println("flags's length: " + flag.length);
        for (int i = 0; i < flag.length; i++) {
            System.out.println("flag=======" + flag[i]);
            System.out.println("-=-=-=Flags.Flag.SEEN=-=-=-=" + Flags.Flag.SEEN);
            if (flag[i] == Flags.Flag.SEEN) {
                isnew = true;
                System.out.println("seen Message.......");
                break;
            }
        }
        return isnew;
    }

    /**
     * 判断此邮件是否包含附件
     */
    @SuppressLint("DefaultLocale")
    public boolean isContainAttach(Part part) throws Exception {

        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);

        boolean attachflag = false;
        // String contentType = part.getContentType();
        if (part.isMimeType("multipart/*")) {
            Multipart mp = (Multipart) part.getContent();
            for (int i = 0; i < mp.getCount(); i++) {
                BodyPart mpart = mp.getBodyPart(i);
                String disposition = mpart.getDisposition();
                if ((disposition != null)
                        && ((disposition.equals(Part.ATTACHMENT)) || (disposition
                        .equals(Part.INLINE))))
                    attachflag = true;
                else if (mpart.isMimeType("multipart/*")) {
                    attachflag = isContainAttach((Part) mpart);
                } else {
                    String contype = mpart.getContentType();
                    if (contype.toLowerCase().indexOf("application") != -1)
                        attachflag = true;
                    if (contype.toLowerCase().indexOf("name") != -1)
                        attachflag = true;
                }
            }
        } else if (part.isMimeType("message/rfc822")) {
            attachflag = isContainAttach((Part) part.getContent());
        }
        return attachflag;
    }

    /**
     * 获得邮件正文内容数组
     */
    public WritableArray getAttachArray() {
        return attachsArray;
    }

    /**
     * 【提取附件】
     */
    @SuppressLint("DefaultLocale")
    public void getAttachMent(Part part) throws Exception {
        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);

        String fileName = "";
        if (part.isMimeType("multipart/*")) {
            Multipart mp = (Multipart) part.getContent();
            for (int i = 0; i < mp.getCount(); i++) {
                BodyPart mpart = mp.getBodyPart(i);//主体部分得到处理
                String disposition = mpart.getDisposition();

                WritableMap attachmap = new WritableNativeMap();

                if ((disposition != null)
                        && (disposition.equals(Part.ATTACHMENT))) {//ATTACHMENT附件，INLINE嵌入
                    fileName = mpart.getFileName();

                    if ((fileName != null) && ((fileName.toLowerCase().indexOf("gb2312") != -1) || (fileName.toLowerCase().indexOf("gb18030") != -1))) {
                        fileName = MimeUtility.decodeText(fileName);
                    }
                    attachmap.putString("name", fileName);
                    attachmap.putString("base64", this.getStringFromInputStream(mpart.getInputStream()));
                    attachsArray.pushMap(attachmap);
//                    saveFile(getCid(mpart), mpart.getInputStream());

//                    saveFile(fileName, mpart.getInputStream());
                } else if (mpart.isMimeType("multipart/*")) {
                    getAttachMent(mpart);
                } else {
                    fileName = mpart.getFileName();
                    if ((fileName != null) && ((fileName.toLowerCase().indexOf("gb2312") != -1) || (fileName.toLowerCase().indexOf("gb18030") != -1))) {
                        fileName = MimeUtility.decodeText(fileName);
                        attachmap.putString("name", fileName);
                        attachmap.putString("base64", this.getStringFromInputStream(mpart.getInputStream()));
                        attachsArray.pushMap(attachmap);
                        //                    saveFile(fileName, mpart.getInputStream());
                    }
                    String cid = getCid(mpart);
                    if (!android.text.TextUtils.isEmpty(cid)) {
                        saveFile(cid, mpart.getInputStream());
                    }


                }
            }
        } else if (part.isMimeType("message/rfc822")) {
            getAttachMent((Part) part.getContent());
        }
    }

    public String getStringFromInputStream(InputStream in) {
        byte[] data = null;
        // 读取图片字节数组
        try {
            ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
            byte[] buff = new byte[100];
            int rc = 0;
            while ((rc = in.read(buff, 0, 100)) > 0) {
                swapStream.write(buff, 0, rc);
            }
            data = swapStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return new String(Base64.encodeToString(data, Base64.DEFAULT));
    }


    /**
     * 获取附件
     */
    private void saveAttachMent(Part part) throws Exception {
        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);
        String fileName;
        if (part.isMimeType("multipart/*")) {
            Multipart mp = (Multipart) part.getContent();
            for (int i = 0; i < mp.getCount(); i++) {

                WritableMap attachmap = new WritableNativeMap();
                BodyPart mPart = mp.getBodyPart(i);
                String disposition = mPart.getDisposition();
                if ((disposition != null) && ((disposition.equals(Part.ATTACHMENT)) || (disposition.equals(Part.INLINE)))) {
                    fileName = mPart.getFileName();
                    if (fileName != null) {
                        fileName = MimeUtility.decodeText(fileName);
                        if (disposition.equals(Part.ATTACHMENT)) {
                            attachmap.putString("name", fileName);
                            attachmap.putString("base64", this.getStringFromInputStream(mPart.getInputStream()));
                            attachmap.putString("path", getSDPath() + "/telemo/" + fileName);
                            attachsArray.pushMap(attachmap);
                        }

                        String cid = getCid(mPart);
                        if (!android.text.TextUtils.isEmpty(cid)) {
                            atachmentsmap.put(cid, getSDPath() + "/telemo/" + fileName);
                        }
                        if (this.isAttachNotTooLarge(mPart.getSize())) {
                            saveFile(fileName, mPart.getInputStream());
                        }
                    }
                } else if (mPart.isMimeType("multipart/*")) {
                    saveAttachMent(mPart);
                } else {
                    fileName = mPart.getFileName();
                    if ((fileName != null)) {
                        fileName = MimeUtility.decodeText(fileName);
                        attachmap.putString("name", fileName);
                        attachmap.putString("base64", this.getStringFromInputStream(mPart.getInputStream()));
                        attachmap.putString("path", getSDPath() + "/telemo/" + fileName);
                        attachsArray.pushMap(attachmap);
                        String cid = getCid(mPart);
                        if (!android.text.TextUtils.isEmpty(cid)) {
                            atachmentsmap.put(cid, getSDPath() + "/telemo/" + fileName);
                        }
                        if (this.isAttachNotTooLarge(mPart.getSize())) {
                            saveFile(fileName, mPart.getInputStream());
                        }
                    }
                }
            }
        } else if (part.isMimeType("message/rfc822")) {
            saveAttachMent((Part) part.getContent());
        }

    }

    private boolean isAttachNotTooLarge(int size) {
        if (size > 10 * 1024 * 1024) {
            System.out.print("file is too big");
            return true;
        }
        return true;
    }

    /**
     * 【设置附件存放路径】
     */
    public void setAttachPath(String attachpath) {
        this.saveAttachPath = attachpath;
    }

    /**
     * 【设置日期显示格式】
     */
    public void setDateFormat(String format) throws Exception {
        this.dateformat = format;
    }


    public static String getCid(Part p) throws MessagingException {
        String content, cid;
        String[] headers = p.getHeader("Content-Id");
        if (headers != null && headers.length > 0) {
            content = headers[0];
        } else {
            return null;
        }
        if (content.startsWith("<") && content.endsWith(">")) {
            cid = "cid:" + content.substring(1, content.length() - 1);
        } else {
            cid = "cid:" + content;
        }
        return cid;
    }

    public boolean isCidImgAndReplace(String text) {
        if (TextUtils.isEmpty(text)) {
            return false;
        }
        return text.contains("<img src=\"cid:");
    }

    public String replaceLocalPathByImgCid(String content, String fileName, String filePath) {
        return content.replace("src=" + "\"" + fileName + "\"", "src=\"file://" + filePath + "\"").toString();
    }

    public String getSDPath() {
        File sdDir = null;
        boolean sdCardExist = Environment.getExternalStorageState()
                .equals(android.os.Environment.MEDIA_MOUNTED);//判断sd卡是否存在
        if (sdCardExist) {
            sdDir = Environment.getExternalStorageDirectory();//获取跟目录
        }
        return sdDir.toString();
    }


    /**
     * 【获得附件存放路径】
     */
    public String getAttachPath() {
        return saveAttachPath;
    }

    /**
     * 【真正的保存附件到指定目录里】
     */
    @SuppressLint("DefaultLocale")
    private void saveFile(String fileName, InputStream in) throws Exception {
        String osName = System.getProperty("os.name");
        System.out.println("----fileName----" + fileName);
        if (osName == null) {
            osName = "";
        }
        try {
            File file = new File(getSDPath() + "/telemo");
            if (!file.exists()) {
                file.mkdir();
            }
        } catch (Exception e) {
        }
        File storefile = new File(getSDPath() + "/telemo/" + fileName);
        if (storefile.exists()) {
            System.out.println("文件已存在");
            return;
        }
        storefile.createNewFile();
        System.out.println("storefile's path: " + storefile.toString());
        BufferedOutputStream bos = null;
        BufferedInputStream bis = null;
        try {
            bos = new BufferedOutputStream(new FileOutputStream(storefile));
            bis = new BufferedInputStream(in);
            int c;
            while ((c = bis.read()) != -1) {
                bos.write(c);
                bos.flush();
            }
        } catch (Exception exception) {
            exception.printStackTrace();
            throw new Exception("文件保存失败!");
        } finally {
            bos.close();
            bis.close();
        }
    }

}
