Javaweb第二十八天学习

文件上传
导包: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:

posted @ 2022-02-20 23:49  向尧  阅读(33)  评论(0)    收藏  举报