文件上传
本质
本质:I/O的读写
客户端(浏览器) 发送文件 Http协议 通过协议 将文件内容写过去 - - - 网络输入流
服务器(Web容器) 接收文件 协议 文件内容读进来 - - - 网络输入流 本地输出流
使用别人写好的包进行文件上传
常用的是一个apache提供的一个包 (一些框架也有 但其底层也是基于apache的这个包)
commons-fileupload.jar
commons-io.jar
去官网下载 www.apache.org
上传步骤
浏览器端
1.写一个JSP/HTML 做展示 (选择文件 )
2.必须通过表单提交
3.必须使用post方式
规定:ServletFileUpload 类中的一个属性post规定
字节数: get请求没有限制,肯定通过URL拼接
每一个浏览器对应URL的处理长度有所不同
IE 2048+35 IE 4076
Google 8182
FireFox 65535
Safari 80000
Opera 190000
Post没有限制 需要Web容器支持 也可以修改长度 在Tomcat的配置文件里 server.xml <Connector port="8080" maxPostSize="-1" > -1或0即不做限制
4.以前的表单 只有两个属性 action method
如果想要文件上传 表单必须再添加一个属性
enctype="multipart/form-data"
指定表单数据的编码类型为 multipart/form-data
,以便支持文件上传
5.必须使用 <input type="file" > 通过这个组件让用户选择上传的文件
不仅仅能得到文件名 还能将文件内容读出来
服务器端
1.引入文件上传所需要的jar包
commons-fileupload.jar
commons-io.jar
2. · 使用一个DiskFileItemFactory对象创建工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
· 使用一个ServletFileUpload对象 包含一个factory
ServletFileUpload upload = new ServletFileUpload(factory);
· 使用upload对象解析request 得到一个List<FileItem>
List<FileItem> itemList = upload.parseRequest(request);
3.自己的业务逻辑
通过遍历集合可以获取每一个item元素
FileItem item 元素可能是一个普通组件 可能是一个文件
item.isFormField();方法可以判断是否是一个普通文件
如果item是一个普通的组件
注意:不能用原生的方式获取参数request.getParameter();
使用如下方式获取
String = item.getFieldName();获取组件的name属性
String = item.getString();获取组件的value属性
注意:不能使用原生的方式处理中文request.setCharacterEncoding();
使用如下方式处理
如果判断后 item是一个文件
读取文件的内容
item.getInputStream() 获取网络输入流
item.write(File file) 写入文件 临时空间默认tomcat-temp 可能会内存溢出
item.getName() 获取文件名字
如果上传的文件过大
产生临时文件 为了防止丢包
默认情况下在Tomcat的temp文件夹中
factory.setSizeThreshold();// 设置缓冲区的大小 默认10240
factory.setRepository(File file); 可以用工厂设置临时缓冲区的地址
还可以设置上传文件本身的大小
upload.setFileSizeMax(); 上传文件的大小
upload.setSizeMax(); 上传文件的总大小
如何获取根目录
req.getSession().getServletContext().getRealPath("/")
或 String path = this.getServletContext().getRealPath("/"); 根目录下
如果文件上传出现文件名冲突 ?
原来名字+用户+时间.原来后缀
用一个随机产生的名字当作保存在服务器中的文件名字
控制文件上传类型 防止病毒文件
input属性设置 -- accept=".txt,.pdf,.doc,.docx"
或
java后台获取文件名 比对 判断 是否符合标准 进行过滤
文件下载
浏览器端
发送请求的按钮 <a href="download?filename=xxx" > </a>
服务器端
1.接受需要下载的文件名
2.找到文件并创建输入流读取内容
3.处理一下响应时的中文字符
4.设置响应内容类型和状态
5.response创建输出流将内容响应回浏览器