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(); }
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"); } }
普通文本发送,文本加图片,图片加附件
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();
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(); } }
3.图标+附件
创建的邮件块是mixed->这个有两部分part->左边存放图片文字(存放文字图片需要再创建一个邮件快related;MimeMultpart(relate)->右侧存放附件part2.setHandler(FileDataSource)->最后发送邮件块
4)需要注意的
如果是web项目,因为javaee自带的有邮件功能,可能存在问题!
我们要用自己的mail.jar文件功能! 需要删除javaee中mail包!