文件上传与下载(转载)

来源:互联网 发布:java集合转换为字符串 编辑:程序博客网 时间:2024/05/29 15:54

文件上传

文件上传原理分析

1、文件上传的必要前提:
一、进行文件上传时只能使用post方式提交表单
二、表单必须添加一个属性:enctype=”multipart/form-data”
三、用于上传文件的元素必须时

2、enctype属性
作用:告知服务器请求正文的MIME类型,作用与content-type一致。
可选值:
a)application/x-www-form-urlencoded(默认)
b)multipart/form-data:
通过字符串把普通项和文件上传项分开
request.getParameter(String)方法获取指定的表单字段字符内容,但文件上传表单已经不在是字符内容,而是字节内容,所以失效。
用传统取得提交参数的方式得到表单中提交的文本输入框中的内容
在使用enctype=”multipart/form-data”提交表单后,文件内容可以被导航才到服务器,但同时,表单中的其他普通项不能再使用传统的getPatameter等方式取得其值。

实现文件上传功能

1、fileupload
fileupload是由apache的commons组件提供的上传组件。它最主要的工作就是帮我们解析request.getInputStream()。
导入commons-fileupload相关jar包
- commons-fileupload.jar,核心包;
- commons-io.jar,依赖包。

//通过请求对象的输入流可以得到上传的内容(文件内容和普通参数)
ServletInputStream is = req.getInputStream();

2、fileupload的核心类的使用
DiskFileItemFactory、ServletFileUpload、FileItem

使用fileupload组件的步骤如下:
1.创建工厂类DiskFileItemFactory对象:
DiskFileItemFactory factory = new DiskFileItemFactory()
2.使用工厂创建解析器对象:
ServletFileUpload fileUpload = new ServletFileUpload(factory)
3.使用解析器来解析request对象:
List list = fileUpload.parseRequest(request)

FileItem对象:
FileItem对象对应一个表单项(表单字段)。可以是文件字段或普通字段
- boolean isFormField():判断当前表单字段是否为普通文本字段,如果返回false,说明是文件字段;
- String getFieldName():获取字段名称,例如:,返回的是username;
- String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件;
- String getName():获取文件字段的文件名称;(b.txt)
- String getContentType():获取上传的文件的MIME类型,例如:text/plain。
- int getSize():获取上传文件的大小;
- InputStream getInputStream():获取上传文件对应的输入流;
- void write(File):把上传的文件保存到指定文件中。
- delete();

文件上传注意事项

a、保证服务器的安全
把保存上传文件的目录放在用户直接访问不到的地方。
b、避免文件被覆盖
让文件名唯一即可
c、避免同一个文件夹中的文件过多
方法一:按照日期进行打散存储目录
方法二:用文件名的hashCode计算打散的存储目录:二级目录
d、限制文件的大小:web方式不适合上传大的文件
单个文件大小:
ServletFileUpload.setFileSizeMax(字节)
总文件大小:(多文件上传)
ServletFileUpload.setSizeMax(字节)
e、上传字段用户没有上传的问题
通过判断文件名是否为空即可
f、临时文件的问题
DiskFileItemFactory:
作用:产生FileItem对象
内部有一个缓存,缓存大小默认是10Kb。如果上传的文件超过10Kb,用磁盘作为缓存。
存放缓存文件的目录默认是系统的临时目录。
如果自己用IO流实现的文件上传,要在流关闭后,清理临时文件。
FileItem.delete();


原创粉丝点击