Java web学习第二十八天——文件的上传下载

文件上传

导包:commons-fileupload.jar   commons-io.jar

上传三步:

相关的类:工厂  DiskFileItemFactory

         解析器: ServletFileUpload

         表单项: FileItem

创建工厂:DiskFileItemFactory factory = new DiskFileItemFactory();

创建解析器: ServletFileUpload fileUp = new ServletFileUploadfactory);

使用解析器来解析request 得到FileItem 集合。

List <FileItem> fileItem  = fileUp.parseRequest(request);

 

关于FileItem对象:

Boolean isFormField()  是否为普通文本项

String getFiledName()  返回当前表单的名称

String getString(String charset) 返回表单的值

String getName()  返回上传文件的名称

InputStream getInputStream() 返回上传文件的输入流

Void writeFile destFile 保存上传文件到指定的位置

 

上传的一些细节:

1 文件名称必须保存到WEBINF

  目的是不让浏览器直接访问到 ,安全,和项目绑在一起可以随时使用

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(Roothex.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 下载的要求

  两个头一个流:ContentType:文件类型

 ContextDisposition:默认是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:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值