java深入探究10-文件上传组件FileUpload,邮件开发

 

1.文件上传组件FileUpload

  1)java提供了文件上传的工具包

    需要引入:commons-fileupload-1.2.1.jar(文件上床组件核心包)

         commons-oi-1.4(封装了对文件处理相关工具类)

  2)核心api:

    ServletFileUpload文件核心工具类;

    FileItemFactory->DisFileItemFactory文件上传工厂类

  3)文件上传步骤:

    1.jsp页面:

      这里要注意:form中encType:multipart/form-data:表示的是表单表单上传

            input type="file"满足两个条件就能上传文件了

          三个值:application/x-www-form-urlencoded,multipart/form-data,text/plain

          三个值区别:application/x-www-form-urlencoded  模式方式

                multipart/form-data          文件模式

                text/plain                    

    2.Servlet上传类的书写:

      1)创建文件上传核心工具类ServletFileupload->创建FileItemFactory,DisFileItemFactory文件上传工厂-》设置核心类

          setFileSizeMax(30*1024*1024);setFileSizeMax(30*1024*1024);setHeaderEncoding("UTF-8");

      2)判断文件上传类型:isMultiPartContent(request)->

      3)将request的上传的参数变为FileItem类型的List集合,之后针对FileItem做处理

    3.例子:

// 1. 创建工厂对象
            FileItemFactory factory = new DiskFileItemFactory();
            // 2. 文件上传核心工具类
            ServletFileUpload upload = new ServletFileUpload(factory);
            // 设置大小限制参数
            upload.setFileSizeMax(10*1024*1024);    // 单个文件大小限制
            upload.setSizeMax(50*1024*1024);        // 总文件大小限制
            upload.setHeaderEncoding("UTF-8");        // 对中文文件编码处理

            // 判断
            if (upload.isMultipartContent(request)) {
                // 3. 把请求数据转换为list集合
                List<FileItem> list = upload.parseRequest(request);
                // 遍历
                for (FileItem item : list){
                    // 判断:普通文本数据
                    if (item.isFormField()){
                        // 获取名称
                        String name = item.getFieldName();
                        // 获取值
                        String value = item.getString();
                        System.out.println(value);
                    } 
                    // 文件表单项
                    else {
                        /******** 文件上传 ***********/
                        // a. 获取文件名称
                        String name = item.getName();
                        // ----处理上传文件名重名问题----
                        // a1. 先得到唯一标记
                        String id = UUID.randomUUID().toString();
                        // a2. 拼接文件名
                        name = id + "#" + name;                        
                        
                        // b. 得到上传目录
                        String basePath = getServletContext().getRealPath("/upload");
                        // c. 创建要上传的文件对象
                        File file = new File(basePath,name);
                        // d. 上传
                        item.write(file);
                        //item.delete();  // 删除组件运行时产生的临时文件
                        System.out.println("文件上传成功");
                        System.out.println(basePath);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
View Code

 

2.邮件开发

  1)环境配置

    在我们自己电脑上配置邮件服务端(易服务邮器eyoumailserversetup.exe)客户端(foxmail)

    服务端配置:1.新建域名:工具-》服务器配置-》单域名款中输入xiaoping.com(自己随意取);

          2.添加2个用户自己用来测试zhangsan,lisi

      

 

    客户端配置:登录2个用户

接受服务器:localhost:110;发送服务器:localhost:25这里我们是在自己本地测试所以地址是本机地址

  2)邮件开发需要的jar

      mail.jar(核心api);activation.jar(jdk6.0之后就不需要了)

  3)三种邮件体发送

一般的邮件开发工具包

package shop.utils;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * 邮件发送工具类
 * @author 传智.郭嘉
 *
 */
public class MailUitls {
    /**
     * 发送邮件的方法
     * @param to    :收件人
     * @param code    :激活码
     */
    public static void sendMail(String to,String code){
        /**
         * 1.获得一个Session对象.
         * 2.创建一个代表邮件的对象Message.
         * 3.发送邮件Transport
         */
        // 1.获得连接对象
        Properties props = new Properties();
        props.setProperty("mail.host", "localhost");
        Session session = Session.getInstance(props, new Authenticator() {

            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("service@xiaoping.com", "123");
            }
            
        });
        // 2.创建邮件对象:
        Message message = new MimeMessage(session);
        // 设置发件人:
        try {
            message.setFrom(new InternetAddress("service@xiaoping.com"));
            // 设置收件人:
            message.addRecipient(RecipientType.TO, new InternetAddress(to));
            // 抄送 CC   密送BCC
            // 设置标题
            message.setSubject("来自购物天堂官方激活邮件");
            // 设置邮件正文:
            message.setContent("<h1>购物天堂官方激活邮件!点下面链接完成激活操作!</h1><h3><a href='http://192.168.36.103:8080/shop/user_active.action?code="+code+"'>http://localhost:8080/shop/user_active.action?code="+code+"</a></h3>", "text/html;charset=UTF-8");
            // 3.发送邮件:
            Transport.send(message);
        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        
    }
    
    public static void main(String[] args) {
        sendMail("aaa@xiaoping.com","11111111111111");
    }
}
View Code

      普通文本发送,文本加图片,图片加附件

      1.普通文本发送:

        配置Session.getDefaultInstance(pro)邮件参数(

          mail.transport.protocol;

          mail.smtp.host;

          mail.smtp.port;

          mail.smtp.auth;

          mail.debug"

        )-》创建邮件体-》配置邮件体参数-》发送邮件体-》关闭邮件

//1.设置邮件的参数
        Properties prop=new Properties();
        prop.put("mail.transport.protocol", "smtp");//邮件发送协议
        prop.put("mail.smtp.host", "localhost");//主机ip
        prop.put("mail.smtp.port", 25);//端口号
        prop.put("mail.smtp.auth", "true");//用户名密码验证
        prop.put("mail.debug", "false");//调试模式
        //2创建邮件体对象
        Session session=Session.getDefaultInstance(prop);
        MimeMessage message=new MimeMessage(session);
        //3配置邮件体参数
        message.setSubject("我的第一封邮件    ");        //主题
        message.setSentDate(new Date());        //时间
        message.setSender(new InternetAddress("zhangsan@xiaoping.com"));//发送人
        message.setRecipient(RecipientType.TO, new InternetAddress("lisi@xiaoping.com"));//接收人
        message.setContent("<a href='www.baidu.com'>百度</a>", "text/html;charset=UTF-8");//发送信息正文
        message.saveChanges();        //可选,保存邮件体
        //4.发送邮件
        Transport trans=session.getTransport();
        trans.connect("zhangsan@xiaoping.com", "123");//配置发送邮件
        trans.sendMessage(message, message.getAllRecipients());
        //关闭邮件
        trans.close();
View Code

      2.图片+文本:创建的邮件块是relate

        与创建文本一样只有:邮件体内容setContent()我们用的是多功能用户邮件(relate)

         创建多功能邮件体:MimeMultpart relate=new MimeMultpart("related");

         之后创建多功能邮件体子部分::MimepBodyPart part1=new MimeBodyPart()//用来存放文本

                        MimeBodyPart part2=new MimiBodyPart()//用来存放图片

          part2添加图片:part2.setDataHandler();来添加图片,这里需要的参数DataHandler handler=new DataHandler()

        

public class SendMail {
    private static Properties prop;
    //发件人
    private static InternetAddress sendMan=null;
    static{
        Properties prop=new Properties();
        prop.put("mail.transport.protocol", "smtp");//邮件发送协议
        prop.put("mail.smtp.host", "localhost");//主机ip
        prop.put("mail.smtp.port", 25);//端口号
        prop.put("mail.smtp.auth", "true");//用户名密码验证
        prop.put("mail.debug", "false");//调试模式
        try{
            sendMan=new InternetAddress("zhangsan@xiaoping.com");
        }catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
    /**
     * 发送一个文本普通邮件
     * @throws Exception 
     */
    @Test
    public void sendTextMail() throws Exception{
        //1.设置邮件的参数
        Properties prop=new Properties();
        prop.put("mail.transport.protocol", "smtp");//邮件发送协议
        prop.put("mail.smtp.host", "localhost");//主机ip
        prop.put("mail.smtp.port", 25);//端口号
        prop.put("mail.smtp.auth", "true");//用户名密码验证
        prop.put("mail.debug", "false");//调试模式
        //2创建邮件体对象
        Session session=Session.getDefaultInstance(prop);
        MimeMessage message=new MimeMessage(session);
        //3配置邮件体参数
        message.setSubject("我的第一封邮件    ");        //主题
        message.setSentDate(new Date());        //时间
        message.setSender(new InternetAddress("zhangsan@xiaoping.com"));//发送人
        message.setRecipient(RecipientType.TO, new InternetAddress("lisi@xiaoping.com"));//接收人
        message.setContent("<a href='www.baidu.com'>百度</a>", "text/html;charset=UTF-8");//发送信息正文
        message.saveChanges();        //可选,保存邮件体
        //4.发送邮件
        Transport trans=session.getTransport();
        trans.connect("zhangsan@xiaoping.com", "123");//配置发送邮件
        trans.sendMessage(message, message.getAllRecipients());
        //关闭邮件
        trans.close();
    }
    /**
     * 发送图片邮件
     * @throws Exception 
     */
    @Test
    public void sendImgMail() throws Exception{
        //1创建邮件体
        Session session=Session.getDefaultInstance(prop);
        MimeMessage message=new MimeMessage(session);
        //2设置邮件体参数
        message.setSubject("带图片邮件");
        message.setSender(sendMan);
        message.setRecipient(RecipientType.TO, new InternetAddress("lisi@xiaoping.com"));
        message.setSentDate(new Date());
        /*******************设置邮件内容:多功能用户邮件(related)**********************/
        //2.1发送的邮件体内容:内容是多功能用户邮件有多个部分组成
        MimeMultipart relate=new MimeMultipart("related");
        MimeBodyPart content=new MimeBodyPart();//多功能邮件的两个字部分文本部分
        MimeBodyPart resoure=new MimeBodyPart();//图片部分
        //2.1.1左侧文本设置
        relate.addBodyPart(content);
        relate.addBodyPart(resoure);//将字部分加上去
        content.setContent("<img src='cid:8.jpg'/>  好哈哈!", "text/html;charset=UTF-8");
        //2.1。1右侧图片配置
        String path=SendMail.class.getResource("8.jpg").getPath();
        DataSource ds=new FileDataSource(new File(path));
        DataHandler handler=new DataHandler(ds);
        resoure.setDataHandler(handler);
        //2.2配置的多功能用户邮件加入其中
        message.setContent(relate);
        //发送邮件
        Transport trans=session.getTransport();
        trans.connect("zhangsan","123");
        trans.sendMessage(message, message.getAllRecipients());
        //关闭邮件trans
        trans.close();
    }
}
View Code

      3.图标+附件

        创建的邮件块是mixed->这个有两部分part->左边存放图片文字(存放文字图片需要再创建一个邮件快related;MimeMultpart(relate)->右侧存放附件part2.setHandler(FileDataSource)->最后发送邮件块

 

  4)需要注意的

      如果是web项目,因为javaee自带的有邮件功能,可能存在问题!

      我们要用自己的mail.jar文件功能!  需要删除javaeemail!

posted @ 2017-05-18 14:53  王吉平  阅读(243)  评论(0编辑  收藏  举报