上传
1 上传对表单限制
method=“”post“”
enctype="multipart/form-data"
表单中需要添加文件表单项:<input type="file" name="xxx">
2 上传对servlet 限制
request.getParameter("xxx") 作废,返回永远都为null
ServletInputStream request.getInputStream 包含请求体
多部件表单的体
1 多个部件,即一个表单项一个部件
2 一个部件中自己包含请求头,和空行,以及请求体
3 文件表单项 Content-Disposition:包含name="xxxx",即表单项名称:还有一个filename="xxx",表示上传文件的名称
Content-Type :它是上传文件的MIME类型,例如:image/pjpeg,表示上传的是图片
体就是上传文件的内容
commons-fileupload.jar 依赖commons-io.jar
这个组件,会帮助解析request的上传数据,解析后的结果是一个表单项数据封装到一个FileItem对象中,之后调用方法即可
上传三步:
相关类:
工厂:DiskFileItemFactory
解析器:ServletFileUpload
表单项:FileItem
1 创建工厂:DiskFileItemFactory factory = new DiskFileItemFactory()
2 创建解析器:ServletFileUpload sfu = new ServletFileUpload(factory)
3 使用解析器来解析request,得到FileItem集合:List<FileItem> fileItemList = sfu.parseRequest(request)
FileItem
boolean isFormField() 是否为普通表单项 返回true为普通表单项,否则为文件表单项
String getFiledName() 返回当前表单项的名称
String getString(String charset) 返回表单项的值
String getName() 返回上传的文件名称
long getSize() 返回上传文件的字节数
InputStream getInputStream() 返回上传文件对应的输入流
void write(File destFile) 把上传的文件内容保存到指定的文件中
String getContentType()
上传的细节
1 文件必须保存到WEB-INF下
目的是不让浏览器直接访问到
2 文件名称相关问题
有的浏览器上传的文件名是绝对路径,这需要切割
String filename = fi2.getName();
int index = filename.lastIndexOf("\\");
if(index ! = -1){
filename = filename.substring(index+1);
}
文件名乱码或者普通表单项乱码: request.setCharacterEncoding("utf-8") ,因为内部调用request.getCharacterEncoding();
request.setCharacterEncoding("utf-8")
servletFileUpload.setHeaderEncoding("utf-8");// 优先级高
文件名同名问题:我们需要为每个文件添加名称前缀,这个前缀可以使用uuid,保证不会重复
filename = CommonUtils.uuid() + "_" + filename();
3 目录打撒
不能再一个目录下存放太多文件
首字母打撒:使用文件的首字母作为目录名称
时间打撒:使用当前时间作为目录
哈希打撒:通过文件 名称得到int值,即调用hashCode() ,将int值转换成16进制
用前两位用来生成目录,目录为两层,例如:1B2C3D /1/B 保存 文件
4 上传文件的大小限制
单个文件的大小限制
解析器有一个setFileSizeMax(100*1024) 限制单个文件必须在解析开始之前
如果超出限制,parseRequest(request) 会抛出异常
整个请求所有数据的大小限制
setSizeMax(1024*1024) 限制整个表单大小为1m
如果超出限制 parseRequest(request) 会抛出异常
5 缓存大小与临时目录
服务器作为另一个应用程序,上传文件时,是先保存到内存,再保存到硬盘。当文件过大时,无法先保存到内存,所以需要先建立一个临时的文件,下载完成之后再保存到指定的目录。
缓存大小:超出多大,才向硬盘保存,默认10kb
临时目录:向硬盘的什么目录保存
设置缓存打下与临时目录:new DisFileItemFactory(20*1024,new File("F:/temp"))
下载
1 下载就是向客户端响应字节数据。一般响应的是html的字符数据
把一个文件变成字节数组,使用response.getOutputStream() 来响应给浏览器
2 下载的要求
两个头,一个流
Content-Type : 传递给客户端的文件是什么MIME类型(可以通过文件名获取 ServletContext的getMimeType()方法),例如 image/pjpeg
Content-Disposition: 默认值是inline ,表示在浏览器窗口打开,attachment;filename=xxx 显示在下载框中的文件名称
流:要下载 的文件数据
这里会用到commons-io 的一个方法,IOUtils.copy() 参数为两个流,一个绑定文件的流,一个响应客户端的流
3 下载的细节
1 显示在下载框中的中文名称
FireFox: Base64编码
其他大部分浏览器:URL编码
通用方案: filename = new String(filename,getBytes("GBK"),"ISO-8859-1")
public static String filenameEncoding(String filename,HttpServletRequest request) throws IOException
{
Sting 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
是java提供的一组API
邮件协议概述
SMTP:简单邮件传输协议,发邮件协议
POP3:收邮件协议
IMAP:收发邮件协议,因特网消息访问协议
邮件服务器名称
smtp服务器端口号为25,服务器名称为smtp.xxx.xxx
pop3服务器的端口号为110,服务器名称为pop3.xxx.xxx
导包 mail.jar activation.jar
核心类:
1 Session
得到说明已经与服务器连接上了,与Connection的作用相似
需要使用Session.geiInsInstance(Properties props,Authenticator auth)
Properties prop = new Properties ();
prop.setProperty("mail.host","smtp.163.com")
prop.setProperty("mail.smtp.auth","true")
Authenticator auth = new Authenticator (){
protected PasswordAuthentication getPasswordAuthtication (){
return new PasswordAuthentication(用户名,密码);
}
};
Session session = Session.getInstance(prop,auth);
2 MimeMessage
表示一个邮件对象,你可以调用它的setForm() 设置发件人,设置收件人,设置主题,设置正文
setContent(); 添加多部件
3 TransPort
发邮件 TransPort.send(message)
当发送包含多附件的邮件是,邮件体就为多部件形式
1 创建一个多部件的部件内容,MimeMultipart 一个多部件可包含多个主体
MimeMultipart就是一个集合,用来装载多个主体部件 addBodyPart()
2 我们需要创建两个主体部件,一个是文本内容的,另一个是附件的 主体部分叫MimeBodyPart 方法:attachFile() setContent() setFilename()
3 把MimeMultipart设置给MimeMessage
MailUtils工具
方法:createSession(服务器名称,账户,密码); (静态) 得到Session
Mail mail = new Mail(发件人,收件人,主题,正文)
AttachBean ab = new AttachBean(new File(""),文件名称)
mail.addAttach();
send(session,mail) (静态) 发送