15.1-上传和下载_课程笔记.docx_第1页
15.1-上传和下载_课程笔记.docx_第2页
15.1-上传和下载_课程笔记.docx_第3页
15.1-上传和下载_课程笔记.docx_第4页
15.1-上传和下载_课程笔记.docx_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

文件的上传和下载1. 学习目标学习任务:掌握文件上传和下载技术(资源存放服务器磁盘中.)2. 文件上传文件上传:允许客户将本地文件,上传到服务器端 应用场景:上传照片、上传新闻图片、上传音频等等. 上传准备: 1: 提供页面给用户 点击上传 2: 服务器端接受用户上传文件. 不再是一个字符串 request.getParameter(xx)-String 传统获取客户资源api request.getParamtger/values/map String String 上传服务器端 servlet 代码 需要专门api 解析上传文件-I/O 写到 服务器端指定磁盘文件 服务器端如何获取绝对路径! ServletContext.getRealPath()2.1. 文件上传jsp页面设置在用户的页面 .jsp 页面需求如下:jsp页面需要的参数配置1、在用户页面中添加上传输入项 (客户端页面操作) 注意事项:要求1) 必须为文件上传input 提供name属性,否则文件上传内容不会被表单提交 2) 表单的提交是post 3) 设置表单的enctype=multipart/-data 使得文件上传编码 - MIME编码格式上传页面的编写说明day18_upload 工程 编写 upload.jsp 页面上传jsp页面硬性要求upload.jsp 页面设计:2: 服务器端 servlet 表单提交action 地址 获取上传信息 解析文件 -I/O 写到磁盘位置 解析request.getInputStream 将文件和文本信息 分类保存 请求参数信息 自动封装一个对象 FileItem对象 引入 apache 上传框架 一组 jar 引入lib 目录即可 lib 引入2个jar 查看文档 如何上传! 解析request.InputStream 重点从此开始1: 开发步骤 2: 文档 参照 解析request 对象 List 集合 所有请求参数信息 集合里面泛型! 集合里面元素类型! FileItem : 将上传 普通文本 type=text/radio 类型 封装到FileItem对象 将上传 文件 type=file - 封装到FileItem 对象里面 解析完成!3: 集合元素进行分类处理 参照文档 集合分类代码 文档 集合List 上传文件处理代码item.getFiledName(): - 获取标签 input 标签 name属性对应值item.getName(); - 上传文件文件名item.getContentType()- 上传文件的mime类型 text/html /注意: 乱码问题 普通文本域 解决乱码 getString(utf-8) 文件名称乱码 : 解析之前解决 parser.setHeaderEncoding(utf-8)关键步骤 上传文件 写到服务器指定磁盘位置:上传本质 1 获取服务器存放上传文件绝路路径 2: item.write(file) 将文件写到指定文件 代替i/o 读取!item.isFormField() 循环遍历集合 判断当前元素是否是一个普通文本域 还是一个上传文件.测试:代码 发现 服务器tomcat主目录 temp 临时目录 会有上传临时文件 缓存! 上传文件完成之后 清除缓存 item.delete() 清理该目录下缓存!优化版本代码 获取服务器绝对路径.5: 上传完成之后 一般 设置上传文件大小 不允许用户肆意上传大文件. 代码 对上传文件大小处理 添加代码 上传过大 提供友好页面 处理异常 捕捉异常信息 在友好页面 给予处理.上传问题说明2.2. 上传问题 1浏览器兼容问题: 1: IE 出问题 火狐没有问题 IE 报错: E:all_apachesapache-tomcat-6.0.32apache-tomcat-6.0.32webappsday18_uploaduploadE:servlet_day02.docIE 出现问题 上传文件名 带有客户端盘符!代码添加对于浏览器类型 提交数据 处理 IE forefire都要可以实现文件上传引入工具类 处理 盘符问题 下发 分层jar servlet 上传的代码 需要添加一行即可.引入工具类截取文件名上传代码添加工具类 解决文件名问题2.3. 上传问题 2 文件名重名问题 覆盖同一个目录下文件名相同的文件!导致文件丢失! 后续操作显示该文件真实名称! 解决方案: 真实名称 和 随机名称 文件存在服务器路径 都插入到数据库1, asdasfasfa.jpg, 陈冠希.jpg , /upload/mm/asdasfasfa.jpg如何解决生成的文件名相同? 引入:UUID 解决方法 引入工具类 生成随机不同的文件名代码块: 补充: 减轻服务器磁盘一个文件夹存放海量文件 可以引入分离目录算法!(了解!)2.4. 上传的服务器编码详细步骤a) /fileupload/ 下载fileupload jar包 同时下载 commons-fileupload 和 commons-io 两个包 - fileupload依赖io包 b) 将jar包导入 web 工程WEB-INF/lib下 c) 编程实现2.5. commons-fileupload 核心API 分析1、ServletFileUpload 文件上传核心类 static boolean isMultipartContent(javax.servlet.http.HttpServletRequest request) 判断request的编码方式是否为multipart/form-datajava.util.List parseRequest(javax.servlet.http.HttpServletRequest request) 解析request,将请求体每个部分封装FileItem对象,返回List(ServletFileUpload 相关api)void setFileSizeMax(long fileSizeMax) 设置单个文件上传大小 void setSizeMax(long sizeMax) 设置总文件上传大小 void setHeaderEncoding(java.lang.String encoding) 设置编码集 解决上传文件名乱码3、FileItem 表示文件上传表单中 每个数据部分 boolean isFormField() 判断该数据项是否为文件上传项,true 不是文件上传 false 是文件上传if(fileItem.isFormField() / 不是上传项 java.lang.String getFieldName() 获得普通表单项name属性值 java.lang.String getString(utf-8) / 获取非上传文件表单域的数据 获得普通表单项value属性 传入编码集用来解决输入value乱码 else / 是上传项- 上传文件 java.lang.String getName() 获得上传文件名 (注意IE存在路径) java.io.InputStream getInputStream() 获得上传文件内容输入流 / 上传文件 void delete() 删除临时文件(删除时,必须要管理输入输出流)注意上传文件编码的设置问题:因为文件上传表单采用编码方式multipart/form-data 与传统url编码不同,所以getParameter 方法不能使用 setCharacterEncoding 无法解决输入项乱码问题 采用apache自带的中文解决乱码处理:setHeaderEncoding(java.lang.String encoding)2.6. 小结上传文件 上传文件jsp页面设置 1、在用户页面中添加上传输入项 (客户端页面操作) 1) 必须为文件上传input 提供name属性,否则文件上传内容不会被表单提交 2) 表单的提交是post 3) 设置表单的enctype=multipart/form-data 使得文件上传编码 上传文件服务器端:1: 上传文件名 不同浏览器获取的文件名不同 IE 带有盘符 火狐 不带盘符 采用工具类 截取文件名 2: 上传文件位置问题: 存放在WebRoot/及其子目录下 ServletContext.getRealPath(/); 获取服务器的绝对路径 3:上传文件在同一个目录重名问题 如果文件重名,后上传文件就会覆盖先上传文件 文件名 UUID filename = UUID.randomUUID().toString() + filename;4、乱码问题 普通编写项-非上传文件的编码处理 value属性乱码 -fileItem.getString(编码集); item.getString(utf-8);5: 上传文件项 上传文件名乱码处理-fileupload.setHeaderEncoding(编码集); / 核心解析类 解决文件上传名称乱码 upload.setHeaderEncoding(utf-8);3. 文件下载 将服务器端文件下载到客户端(本地电脑)3.1. 编写服务器程序,读取服务器端文件,完成下载 思路分析 :浏览器本身就可以支持文件的下载. 右击另存为 前提 : 浏览器能访问该图片. 很多的网站 不允许用户直接下载. 资源一般存放WEB-INF 下 浏览器不可以直接去访问 我们需要代码完成附件形式下载! 点击需要下载文件 浏览器弹出附件框 另存为 文件输出流 形式写到本地电脑硬盘下载说明: 服务器指定路径 下载目标资源.1: 获取服务器指定路径对应资源 获取服务器绝对路径.2: 如何让浏览器弹出附件框 服务器通知它(浏览器) response通知浏览器弹出附件框3: 附件框弹出 点击下载 (代码出现流的读取) 服务器路径文件 写出到用户电脑磁盘 借助 浏览器!如何通知 浏览器 弹出附件框? http协议 request response(服务器创建 通知浏览器)response 通知浏览器 设置浏览器消息头代码的实现体: download必须设置两个头信息Content-Type 下载文件的类型(mime) Content-Disposition 下载文件采用附件的形式需要下载的输入流 response.getOutputStream();设置文件的类型代码:response.setContentType(getServletContext().getMimeType(filename);设置文件的下载形式:附件下载代码response.setHeader(Content-Disposition, attachment;filename= + filename); / 以附件形式打开,不管格式浏览器是否识别 小结:下载:简称 一个流 2 个头流: 读取服务器资源到本地磁盘:response.getOutputStream()3.2. 下载附件文件名乱码问题如果下载文件是中文名,产生乱码 原因: 不同浏览器 默认解码机制不同不同的浏览器附件框解码方式不同 基于浏览器内核 代码只能和浏览器解码方式要一致 IE使用URL解码 % 、FF使用 BASE64解码 浏览器本身设计机制先可以解决ie乱码:URLEncoder设置 response.setHeader(Content-Disposition, attachment;filename= + filename); 出现附件名乱码 :filename 需要编码输出。不同浏览器处理下载附件名乱码 处理方式不同 ,解决乱码问题我们需要获取不同的浏览器头信息。通过USER-AGENT 请求头信息字段,判断来访者浏览器类型 request对象获取 服务器端:火狐采用Base64编码引入Base64Encoder类 该类 myeclipse 自带环境没有该类 切换自己jdk 环境 步骤: 右击当前工程-build path -confi.点击 add library myeclipse 自带jdk 切换自己jdk 点击 Installed JRE 点击add 选择自己jdk 安装主目录即可弹出 点击下一步 next点击 Directory选择 bin 上一层即可点击finish 选择自己jdk选择 radio 即可 !finish 完成!可以使用了!代码设计:解决:采用手动BASE64 编码 BASE64Encoder base64Encoder = new BASE64Encoder();filename = =?utf-8?B? + base64Encoder.encode(filename.getBytes(utf-8) + ?=;判断不同的浏览器下载的中文编码处理 模版代码:工具代码:工具类编码 解决不同浏览器附件名乱码String agent = request.getHeader(user-agent);String realname = resource.getRealname();if (agent.contains(Firefox) / 采用BASE64编码realname = =?UTF-8?B?+ new BASE64Encoder().encode(realname.getBytes(utf-8) + ?=; else / 其它浏览器 IE 、google 采用URL编码realname = URLEncoder.encode(realname, utf-8);realname = realname.replace(+, );response.setHeader(Content-Disposition,attachment;filename= + realname);4. 综合案例 简易网盘上传和下载 4.1. 需求说明(登陆网站另一个下载页面)1、系统提供一个文件上传功能,在用户上传文件后,文件保存在服务器端指定目录, 文件相关信息保存在数据库中 * 每上传一个文件,数据库中存在一条数据记录 2、系统提供一个文件下载功能,将数据表中所有资源信息,显示在页面上, 允许用户进行下载 搭建环境 基于三层结构create table resources( id int primary key auto_increment, uuidname varchar(100) unique not null, - 服务器上传uuid文件名称 realname varchar(40) not null, - 该文件真实名称 savepath varchar(100) not null, - 文件在服务器磁盘中保存路径 uploadtime timestamp , - 上传文件时间戳 description varchar(255);导入jar包 、c3p0-config.xml 、JDBCUtils工具类 . 1: c3p0 连接池 配置文件2: mysql 数据库jar 3: jstl.jar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论