天天看点

上传、下载文件以及发送邮件

上传(上传不能使用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);
           

继续阅读