上传(上传不能使用BaseServlet)
1.上传对表单的限制
- method = “post”
- enctype = " multipart/form-data"(form表单的属性)
- 表单中需要添加文件表单项:
2.上传对Servlet的限制
-
request.getParametere(“xxx”);这个方法在表单为enctype = " multipart/form-data"时,它作废了,永远为null。
获取参数:
ServletInputStream request.getInputStream();包含整个请求体。
步骤:
DiskFileItemFactory factory = new DiskFileItemFactory();//创建工厂
ServletFileUpload upload = new ServletFileUpload(factory);//创建解析器
//解析开始
List<FileItem> fileitemList = upload.parseRequest(request);
3.多部件表单体
- 分割出多个部件,及一个表单项一个部件
4.需要的jar包
- commons-fileupload.jar
-
.commons-io.jar
这个小组件能帮我们解析request中上传数据,解析后的结果是一个表单项数据封装到一个FileItem对象中,我们只需要调用FileItem的方法即可。
5.上传细节:
文件必须保存到WEB-INF下
-
目的是不让浏览器直接访问到。
咋说呢,如果有人上传了一个jsp等其他文件与自己的文件同名了,将会覆盖原来的文件。
文件名称相关问题
- 有的浏览器上传的文件名是绝对路径,这需要切割
String filename = fi2.getName();
ing index = filename.lastIndexOf ( "//" );
if ( index != -1){
filename = filename.subString (index+1);
}
-
文件名乱码或普通表单项乱码
1、request.setCharacterEncoding(“utf-8”);因为fileupload内部会调用request.getCharacterEncoding();优先级低
2、ServletFileUpload.setHeaderEncoding(“utf-8”);优先级高
-
文件同名问题,我们需要为每个文件添加名称前缀,这个前缀要保证不能重复。uuid
filename = CommonUtils.uuid() + “_” + filename;
目录打散
-
不能在一个目录下存放过多文件,可能引起电脑卡顿。
首字母打散,使用文件的首字母作为目标目录名称,例如:abc.txt,那么我们把文件保存在a目录下,如果此时a不存在,则创建a目录。
时间打散
Hash哈希打散法:
通过文件 名称得到int值,即调用hashCode()
它int值转换为十六进制,0-9,A-F
获取十六进制的前两位用来生成目录,目录为二层例如:1B2C3D4E5F, /1/B/…
上传文件大小限制
-
单个文件大小限制(解析器)**
解析器里面可以限制单个文件大小
upload.setFileSizeMax(100*1024);//限制单个文件大小,必须在解析之前执行
如果超出大小,报异常
- 整个请求所有的数据大小限制
解析器里面可以限制整个表单文件大小
upload.setSizeMax(1024*1024);//限制整个表单文件大小
如果超出大小,报异常
缓存大小与临时目录
说明:当文件太大时将文件向硬盘保存,瞬间生成一个临时目录,然后消失。
- 缓存大小:超出多大,才向硬盘保存!默认10KB
-
临时目录:向硬盘保存的位置
设置缓存大小与临时目录:
new DiskFileItemFactory(1024*10 , new File ( “临时文件路径” ));
下载
1.下载
说明:向客户端响应字节数据!把一个文件变成字节数组,使用response.getOutputStream();
下载要求:
两个头一个流:
Contenr-Type: 你传递给客户端的文件时什么MIME类型,例如:image.pjpeg
通过文件名称调用ServletContext.getMimeType()方法,得到MIME类型。
Content-Disposition:它的默认值是为inline,表示在浏览器窗口中打开!attachement;filename=xxx
在filename=xxx,xxx表示显示框下载文件的名称!
流:自己要下载的问价数据!
自己new一个输入流即可
下载地址:将下载的流输出出来。
2.下载细节
- 显示在下载框中的中文名称时,会出现乱码
- FireFox:Base64编码
-
其它大部分浏览器:URL编码
通用方案:filename = new String(filename.getBytes(“GBK”,“ISO-8859-1”));
JavaMail
1.邮件协议:
- SMTP:(简单邮件传输协议)发邮件协议
- POP3:(邮局协议第三版)收邮件协议
- IMAP:(因特网消息访问协议)收发邮件
2.邮件服务器命名
- SMTP端口号:25,服务器名称:smtp.xxx.xxx
- POP3端口号:110 ,服务器名称:pop3.xxx.xxx
4.核心类
-
Session:
如果得到session,表示已经与服务器连接上了,与connection作用相似
得到session,Session.getInstance(Properties,Authenticator);
Properties props = new Properties();
props.setProperty("mail.host","smtp.163.com");
props.setPerty("mail.smtp.auth","true");
Authenticator auth = new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication("用户名","密码");
}
};
Session session = Session.getInstance(props,auth);
-
MimeMessage:
表示一个邮件对象,可以调用它的setFrom(),设置发件人、收件人、设置主题、设置正文。
MimeMessage msg = new MimeMessage (session);
msg.setFrom(new InternetAddress(""收件人));//设置发件人
msg.setRecipients(RecipientType.TO,"收件人")//设置收件人
msg.setRecipients(RecipientType.CC,"收件人")//设置收件人,抄送
msg.setRecipients(RecipientType.BCC,"收件人")//设置收件人,暗送
msg.setSubject("这里是邮件内容");//内容
//MimeMultipart为邮件多部件,可以上传附件,创建的是一个list集合。
- TransPost: 发邮件
Transport.send(msg);
*使用MailUtils小工具发送邮件:
jar包:
1.Mail.jar
2.activation.jar
3.itcast-tools-1.4.2.jar
代码:
// 得到session
Session session = MailUtils.createSession("smtp.163.com", "itcast_ctx", "itcast");
// 创建邮件对象
Mail mail = new Mail("发件人", "收件人", "邮件主题", "邮件内容");
// 创建两个附件对象
AttachBean bean1 = new AttachBean(new File(""), "附件名称");
AttachBean bean2 = new AttachBean(new File(""), "附件名称");
mail.addAttach(bean1);
mail.addAttach(bean2);
// 发送邮件
MailUtils.send(session, mail);