文件上传
导包:commons-fileupload.jar commons-io.jar
上传三步:
相关的类:工厂 DiskFileItemFactory
解析器: ServletFileUpload
表单项: FileItem
创建工厂:DiskFileItemFactory factory = new DiskFileItemFactory();
创建解析器: ServletFileUpload fileUp = new ServletFileUpload(factory);
使用解析器来解析request 得到FileItem 集合。
List <FileItem> fileItem = fileUp.parseRequest(request);
关于FileItem对象:
Boolean isFormField() 是否为普通文本项
String getFiledName() 返回当前表单的名称
String getString(String charset) 返回表单的值
String getName() 返回上传文件的名称
InputStream getInputStream() 返回上传文件的输入流
Void write(File destFile) 保存上传文件到指定的位置
上传的一些细节:
1 文件名称必须保存到WEB—INF下
目的是不让浏览器直接访问到 ,安全,和项目绑在一起可以随时使用
2 文件的名称问题
有的浏览器上传的文件路径是绝对路径,所以需要切割
String filename = fileItem.getName();
Intindex = filename.lastIndexOf(“\\”);
If(index!=-1){filename= filename.substring(index+1)}
文件名乱码:
Request.setCharacterEncoding(“UTF-8”);
文件名称重复问题:
filename = commonUtils.uuid()+”-“+filename;
3 目录打散问题:
目的是为了不再同一个目录下存放太多文件
**首字母打散:使用文件的首字母作为目录,例如abc.txt那么目录就是a
**时间打散:
** 哈希打散:
通过文件的名称得到INT值,即调用hashCode()他的INt的值转化成16进制数
获取前两位生成目录。
ServletFileUpload sfu = new servletFileUpload(factory);//得到解析器
List<FiliItem> list = sfu.parseRequest(request);//得到表单项
FileItem fi = list.get(1);//得到文件表单项
String root = this.getServletContext().getRealPath(“/WEB-INF/files/”);
String filename = fi.getName();//得到表单文件的名称
//防止绝对路径问题,分离出文件名称
Intindex = filename.lastIndexOf(“\\”);
If(index!=-1){filename=filename.substring(index+1)}
String sacename = CommonUtile.uuid()+”-”+filename;
Inthashcode = filename.HashCode();得到哈希值
String hex = Integer.toHexString(hashcode);//换成16进制
FiledirFile = new File(Root,hex.charAt(0)+hex.charAt(0));
dirFile.mkdirs();//创建目录链
File destFile = new File(dirFile,sacename);
Fi.write(destFile);
1 上传文件的大小
单个文件的大小:sfu.setFileSizeMax(1000*1024);最大是1000K,但是要放在解析之前
超过了会有异常
整个表单文件的大小。
Sfn.setSizeMax(1000*1024);
2 缓存大小与临时表
缓存大小:超出多大,开始向硬盘上保存。
临时目录:利用构造器:DiskFileItemFactory(20*1024,newFile(“F:/f/temp”));
文件下载
1下载就是向客户端响应字节数据!
原来我们响应的都是HTML字符数据 把一个文件变成字节数组使用request.getOutputStream()来给浏览器
2 下载的要求
两个头一个流:Content—Type:文件类型
Context—Disposition:默认是Inline,表示在浏览器中打开
流就是要下载的文件
response.setHeader("Content-Type", contentType);
response.setHeader("Content-Type", contentType);
response.setHeader("Content-Disposition", contentDisposition);
ServletOutputStream output = response.getOutputStream();
IOUtils.copy(fis,output);
下载的细节:
显示在下载框中的中文名称时,会出现乱码。
使用String name = new String (filename.getByte(“GBK”),”ISO-8859-1”);
JavaMail
核心类:
1 Session:如果得到它。表示与服务器连接上了,
2 MimeMessage ,它表示一个邮件对象,可以设置发件人,收件人,邮件的内容
3 Taransport: