JavaWeb的文件操作与邮件发送_day8
一、文件的上传:
1、文件上传对页面的要求:
》上传对表单的限制:>上传的格式必须是method = "post"。
>表单必须添加属性:enctype = "multipart/form-data":多部件表单形式。用于将表单中的中文转换为URL编码。多部件表单形式是将表单项分为不同的组件,一个表单项即为一个组件。
*** 一个组件包含请求头、空行、请求体。
>表单中必须添加文件表单项:<input type = "file" name = "……"/>
》上传对servlet的限制:
>因为表单添加了enctype = "multipart/form-data"属性,所以在servlet中不能使用request的getparamer()方法,因为该方法返回的是String类型,即服务器将传输来的数据都作为了String类型进行处理。而使用了此特定属性的表单会将所有数据当做文件进行传输。
——解决方法:通过getInputStream()获得文件的流操作。
2、servlet对上传文件的解析:
》jar包:Commons-fileupload.jar(核心jar包)、commons-io.jar(核心jar包的主要依赖)
》jar功能:将多部件信息以分隔符为单位封装到fileItem中。
》上传三步:工厂创建(DiskFileItemFactory)、解析器创建(servletFileUpload)、获得表单项(fileItem)
》上传细节:
>上传文件的保存路径必须在WEB_INF。目的是拒绝浏览器直接访问到文件。
>文件名称问题:有的浏览器上传文件后显示的是文件的绝对路径,但服务器只关心文件的名称,所以需要对文件的路径进行切割。
——解决方法:使用String类型的对字符串进行处理。
>乱码解决:可以有两种解决方式。servletFileUpload的相关方法优先级较高,request的相关方法优先级较低。
>上传文件同名问题:为每一个文件添加添加不重复前缀。
——解决方法:当前毫秒数_原名称
>目录打散:尽量不要在一个目录下存过过多的文件,避免文件过多影响读取速度。
——解决方法:
**** 首字符打散:使用文件的首字母做目录名称,有则保存,没有则创建。但是用于中文的文件名时不同方便。
**** 时间打散:使用当前的上传时间作为目录。会存在空白时间段。
***** 哈希打散:先得到文件的哈希值,然后将int型的哈希值转换为16进制数,最后获取16进制的前两位作为目录。
——文件保存步骤:1、获得保存路径;2、获得文件名;3、处理绝对路径;4、处理文件同名问题;5、获得文件的hashCode值 ,并创建目录;6、创建文件的保存位置;7、使用fileItem的输出流保存文件。
>上传文件的大小限制:单个文件大小限制与总体大小限制。
——servletFileUpload的setFileSizeMax():设置单个文件的大小上限
——servletFileUpload的setSizeMax():设置总文件大小上限。
>缓存大小与临时目录:
——缓存大小:通常默认设置为10kb,超过10kb,现将文件保存到硬盘上,然后再转移到WEB-INF指定目录下。
——临时目录:用于在硬盘上临时保存大文件。
——设置:DiskFileItemFactory重载的带参构造方法。
二、文件的下载:向客户端响应字节数据流。
1、下载的要求:两个头、一个流。
》content-type:说明要传递的文件类型。
》content-disposition:默认值是inline,表示在浏览器窗口中打开。如果想要弹出下载窗口,需要设置属性值attachment;filename="xxxxx";filename的值即为显示在下载框中的值。
》流:即需要下载的资源。
2、下载的细节:中文名称的乱码问题。
》浏览器编码:fireFox使用的BASE64编码,替他浏览器使用的是URL编码。
》通用解决手段: filename = new String(filename.getBytes("GBK"),"ISO-88591")这种手段无法处理一些特殊字符。
》最主要手段:需要使用一段已完成好的代码段
public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException { String agent = request.getHeader("User-Agent"); //获取浏览器 if (agent.contains("Firefox")) { BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else if(agent.contains("MSIE")) { filename = URLEncoder.encode(filename, "utf-8"); } else { filename = URLEncoder.encode(filename, "utf-8"); } return filename; }
三、javaMail邮件的发送:
1、Java应用模块:javaMail
2、邮件协议:》SMTP:Simple Mail Transfor Protocol ,简单邮件传输协议,输入发邮件协议。
》POP3:Post Office Protocol Version 3,邮局协议。属于收件协议。
》IMAP:Internet Message Acess Protocol ,因特网消息访问协议。
3、邮件服务器协议端口号:SMTP的端口为25,POP3的端口号为110.
4、intel发邮件:
》BASE64编码的使用:使用sun.misc.BASE64Encoder和sun.misc.BASE64Decoder类进行编码与解码。
5、javaMail发邮件:
》需导入包:actvition.jar、mail.jar
》核心类:session。区别于HttpSession,此session、是专门用于邮件的发送。
——session的作用:与数据库连接的Connection类似,当得到它,表示已经与邮件服务器取得连接。
——session的获取:需要propertise类与Authenticator的辅助propertise用于配置服务器地址与认证。
>MemiMessage:表示一个邮件对象,。使用此对象可以设置发件人、收件人、邮件主题、正文。
——发送带有附件的邮件:MimeMultiPart类集:MimeBodypart类用于设置邮件主体内容;attachFile类用于添加附件内容;MimeYtility类用于处理中文编码问题。
6、了解邮件发送工具:MailUtils工具类包。
》邮件发送形式:
>发送:将邮件发送给指定的收件人,会显示发送方的信息。
>抄送:Carbon Copy。将邮件同时发送给收件人以外的人,即将用户发送的邮件抄送一份给别人。对方可以看见该用户的E-mail.
>暗送:Blind Carbon CoPy。暗送能够让收件人只能查看邮件,而不能看到其他收件人的地址。