>[TOC] # 文件上传 *** ## 1、上传注意事项 1. 上传的文件存放在一个不能使用外界URL访问的目录下面,比如WEB-INF目录下 2. 上传到同一个文件夹中的文件名称应该唯一:使用时间戳/UUID/MD5等手段实现 3. 限制上传文件的最大值:因为服务器上硬盘资源很贵,不能让用户随意的使用 4. 限制文件上传类型:比如这个文件夹只用来存储图片,那你就不能上传一个.mp4的文件 ## 2、文件上传需要使用到的3个类+1个属性 * ServletFileUpload:在后端获取文件上传的文件数据,并将上传文件数据的表单中的每个输入项都封装为一个FileItem对象 * FileItem * DiskFileItemFactory:使用ServletFileUpload解析前端表单传过来的文件数据时需要使用到DiskFileItemFactory对象,所以在获取ServletFileUpload对象之前我们需要先获取DiskFileItemFactory对象 * fileItemFactory属性:ServletFileUpload对象的一个属性 * ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象, 在使用ServletFileUpload对象解析请求时需要DiskFileItemFactory对象。所以,我们需要在进行解析工作前构造好DiskFileItemFactory对象,通过ServletFileUpload对象的构造方法或setFileItemFactory()方法设置ServletFileUpload对象的fileItemFactory属性。 ## 3、常用方法介绍 ```java //isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单 //还是一个文件表单,如果是普通表单字段则返回true,否则返回false boolean isFormField(); //getFieldName方法用于返回表单标签name属性的值。 String getFieldName();//获取这个input的name属性值 //getString方法用于将FileItem对象中保存的数据流内容以一个字符串返回 String getString();//用字符串存储文件的数据流 //getName方法用于获得文件上传字段中的文件名 String getName(); //以流的形式返回上传文件的数据内容。 InputStream getInputStream() //delete方法用来清空FileItem类对象中存放的主体内容 //如果主体内容被保存在临时文件中,delete方法将删除该临时文件。 void delete(); ``` ## 4、ServletFileUpload 类 ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中 . 使用其parseRequest(HttpServletRequest) 方法可以将通过表单中每一个HTML标签提交的数据封装成一个FileItem对象,然后以List列表的形式返回,使用该方法处理上传文件简单易用 # 邮件发送 *** ## 1、 发送原理 ![image-20211129185904209](assets/image-20211129185904209.png) 1. 张三通过smtp协议连接到Smtp服务器,然后发送一封邮件给网易的邮件服务器 2. 网易分析发现需要去QQ的邮件服务器,通过Smtp协议将邮件转投给QQ的Smtp服务器 3. QQ将接收到的邮件存储在456789@qq.com这个邮件账号的空间中 4. 李四通过Pop3协议连接到Pop3服务器收取邮件 5. 从456789@qq.com这个邮件账号的空间中取出邮件 6. Pop3服务器将取出来的邮件送道李四手中 ## 2、 复杂文件内容的发送 ![image-20211130100009703](assets/image-20211130100009703.png) ```java import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.util.Properties; public class MailDemo02 { public static void main(String[] args) throws Exception { Properties prop=new Properties(); prop.setProperty("mail.host","smtp.qq.com");// 设置QQ邮件服务器 prop.setProperty("mail.transport.protocol","smtp");// 邮件发送协议 prop.setProperty("mail.smtp.auth","true");// 需要验证用户密码 // QQ邮箱需要设置SSL加密 MailSSLSocketFactory sf=new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable","true"); prop.put("mail.smtp.ssl.socketFactory",sf); // 使用javaMail发送邮件的5个步骤 // 1.创建定义整个应用程序所需要的环境信息的session对象 Session session=Session.getDefaultInstance(prop, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("11927XXX@qq.com","授权码"); } }); // 开启session的debug模式,这样可以查看到程序发送Email的运行状态 session.setDebug(true); // 2.通过session得到transport对象 Transport ts=session.getTransport(); // 3.使用邮箱的用户名和授权码连上邮件服务器 ts.connect("smtp.qq.com","11927XXX@qq.com","授权码"); // 4.创建邮件:写文件 // 注意需要传递session MimeMessage message=new MimeMessage(session); // 指明邮件的发件人 message.setFrom(new InternetAddress("11927XXX@qq.com")); // 指明邮件的收件人 message.setRecipient(Message.RecipientType.TO,new InternetAddress("11927XXX@qq.com")); // 邮件标题 message.setSubject("java发出"); // 邮件的文本内容 // =================================准备图片数据======================================= MimeBodyPart image=new MimeBodyPart(); // 图片需要经过数据化的处理 DataHandler dh=new DataHandler(new FileDataSource("src/resources/1.jpg")); // 在part中放入这个处理过图片的数据 image.setDataHandler(dh); // 给这个part设置一个ID名字,sr image.setContentID("1.jpg"); // 准备正文的数据 MimeBodyPart text=new MimeBodyPart(); text.setContent("这是一张正文","text/html;charset=UTF-8"); // 描述数据关系 MimeMultipart mm=new MimeMultipart(); mm.addBodyPart(text); mm.addBodyPart(image); mm.setSubType("related"); // 设置到消息中,保存修改 message.setContent(mm); message.saveChanges(); // 5.发送邮件 ts.sendMessage(message,message.getAllRecipients()); // 6.关闭连接 ts.close(); } } ```