文件上传的基本条件和步骤
文件上传的基本条件:
1、 必须提供form表单
2、 form表单的请求方式为post
3、 form表单的enctype属性值必须为multipart/form-data
4、 提供input的file类型标签
5、 必备文件上传的架包和其依赖包
文件上传思路步骤:
1、 获取工厂DiskFileItemFactory
2、 通过工厂获取文件上传核心类ServletFileUpload
3、 解析表单数据,得到多个表单项对象FileItem
通过FileItem对象获取表单项的值并做相应的处理
文件上传的相关类和方法:
核心类ServletFileUpload:
setHeaderEncoding(String charset):解决中文文件名乱码问题
setSizeMax(long size):设置表单的上传大小限制
setFileSizeMax(long size):设置表单单个文件上传大小限制
ListItem类:
getString():获取表单数据的文本信息
getString(String charset):获取表单数据的文本信息,指定解码方式
getFileName():获取表单项的属性名称
getName():获取上传文件的文件名称
delete():表示删除临时文件(小的临时文件)
write(File file):把上传的文件写入到指定的文件中
文件上传的细节问题
浏览器版本不同的问题解决方案:
当浏览器版本不同getFileName的方法获取的文件名将会不同,因此需要对文件名进行处理。
1、 先获取获取的文件名最后一次出现"\"的位置(脚标)
2、 从获取的脚标值加1位置开始截取,一直到结束
以上两步就可解决浏览器版本问题
文件名同名问题解决方案:
当上传文件的文件名出现重复时,后一个文件会覆盖前一个文件,这样会造成数据的丢失和被更改
1、 以"."截取文件的扩展名
2、 将原有的文件名改为uuid,然后拼接文件扩展名,形成一个新的唯一的文件名
文件上传的目录打散和缓冲设置:
目录打散:
存在的问题:单个文件目录中不能保存过多的数据。
解决方案:目录打散,使得所有的文件分散到不同的目录中
步骤:
1、 使用原始文件名获取该文件名的int类型hashCode值
2、 将int类型的hashCode值转为16进制值
3、 取16进制值的前两位作为两层目录和项目中存储上传文件的目录进行拼接
4、 然后调用File类的mkdirs方法,创建出多层目录
5、 将上传的文件存储到最后一层目录下
缓冲设置:
存在的问题:由于内存有限,当上传大文件的时候,全部读取到内存中是不可取的
解决方案:设置内存中内存储的临时文件的大小,当大于该值的时候,将文件放置到缓冲目录下,等上传完毕,一次性写入到目标目录下
步骤:在创建工厂的时候使用有参的构造方法即可
DiskFileItemFactory(int size,File res):size表示内存最大存储数据大小,当超过该设定值时,将会把内存中的数据写到临时目录下,res表示指定的临时目录
文件下载的步骤
文件下载步骤:
1、 获取下载文件在服务器端的真实保存路径
2、 里有该真实路径获取文件mime类型和创建File对象
3、 判断file是否存在,存在就继续执行
4、 设置响应头的contextType为获取的mime类型
5、 设置下载时的弹窗
6、 创建输入流读取服务端的文件到内存中
7、 使用response对象的输出流将文件输出给客户端
文件下载的弹窗和文件名乱码
弹窗设置:
弹窗的响应头名:context-disposition
弹窗的响应头值:attachment;filename=......
文件名乱码出现位置:
客户端弹窗的时候,显示的文件名为乱码,对应服务端代码位置就是弹窗响应头值的文件名设置
乱码解决方案:
1、 IE和Chrome浏览器采用的都是URLDecoder对象解码,因此服务端只要按照指定的对象URLEncoder对文件名进行编码即可
2、 firefox使用的base64进行解码和编码,因此服务端也要使用base64编码
3、 在接收下载请求的时候先获取浏览器的版本,然后根据版本进行编码即可
发送邮件:
导入邮件必备的jar包:
1、 mail.jar
2、 activition.jar
普通邮件发送步骤:
1、 获取Session对象,和邮箱的服务器获取连接
2、 利用Session对象创建MimeMessage对象,在该对象中设置发送人、收件人、邮件主题、邮件内容等
3、 使用TransPort对象实现将邮件发送出去
普通邮件核心类:
Session类:Session类没有构造方法,创建session对象使用的是静态方法获取,获取的时候需要两个参数。
Session getInstance(Properties pro,Authenticator auth):
pro中需要设置的值:
第一个参数是邮箱的主机:mail.host--->smtp.163.com
第二个参数是邮箱的验证:mail.smtp.auth--->true
auth对应的类不能直接创建对象,需要使用匿名内部类实现
Authenticator auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("用户名", "密码");
//用户名表示的是邮箱的用户名,密码表示的是邮箱的密码
}
};
MimeMessage类:表示的是一个邮箱对象
setFrom(InternetAddress inter);设置发件人
addRecipients(RecipientType.TO,String to):第一个参数表示发送,to表示收件人,收件人可以有多个,用逗号隔开
RecipientType.TO 表示发送给正式收件人
RecipientType.CC 表示抄送
RecipientType.BCC 表示暗送
setSubject(String subject):设置邮件的主题
setContent(String str,String contentType):str表示邮件的正文,第二个参数表示设置文件的类型
TransPort类:用于发送邮件
send(MimeMessage msg):表示发送邮件,msg表示已经设置好的邮件对象
带附件邮件的发送:
1、 获取Session对象,和邮箱的服务器获取连接
2、 利用Session对象创建MimeMessage对象
3、 创建MimeMultipart对象,该对象相当于多组件的集合,将该对象添加到MimeMessage对象中
4、 创建多个MimeBodyPart对象,表示多个组件,这多个组件将组成一个邮件对象,此时对多个组件进行设置
5、 将多个MimeBodyPart对象设置到MimeMultipart对象中
6、 使用TransPort对象实现将邮件发送出去
多组件邮件的组成图:
带附件发送的附加类或方法:
MimeMessage的方法setContent(MimeMultipart m):将多组件集合对象设置到邮件对象的内容中。
MimeMultipart类:多组件对象,将多个组件集合起来,一起放到邮件的正文中。
常用方法:addBodyPart(MimeBodyPart p):将组件对象添加到多组件对象中
MimeBodyPart类:组件对象。
设置文本方法:
setContent(String content,String contentType):
第一个参数表示的是文本内容,第二个参数表示的文本mime类型和编码方式
attachFile(String path):设置附件,path表示的是附件的路径
setFileName(String name):设置附件的名称,name表示的是附件名称
注:当设置文件的名称时存在中文,可以使用下面的方法可以防止乱码问题
setFileName(MimeUitlity.encodeText(String name));