文件上传下载
文件上传
|---------------------------------------------------------------------|
| 文件上传的应用 比如个人信息的管理,上传头像 比如商品信息的管理,上传商品的图片 这些都需要通过浏览器客户端将图片上传到服务器的磁盘上 |
文件上传原理
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 所谓的文件上传就是服务器端通过request对象获取输入流,将浏览器端上传的数据读取出来,保存到服务器端 客户端浏览器注意事项 1.请求方式必须是 post 2.需要使用组件<input type="file" name="file"> 3.表单必须设置enctype="multipart/form-data" 服务器端处理 通过request对象,获取InputStream, 可以将浏览器提交的所有数据读取到. |
上传开源框架-commons-upload
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现。 使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io, commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持 |
文件上传案例
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 在浏览器端创建一个可以上传文件的表单,在服务器端通过commons-fileupload完成文件上传。 浏览器端注意三件事情: 1.表单的method=post 2.设置enctype=multipart/form-date 3.使用具有name属性的file元素 在服务器端 1.创建DiskFileItemFactory 2.创建ServletFileUpload 3.通过ServletFileUpload的parseRequest方法得到所有的FileItem 1.设置浏览器端 <form action="Upload" method="post" enctype="multipart/form-data" > <input type="file" name="photo" /> <input type="submit" value=" 上传 " /> </form> 2.在服务器端操作 关键类: DiskFileItemFactory:ServletFileUpload工厂类 ServletFileUpload:用于处理文件上传的类 IOUtils:文件上传IO流类 BeanUtils:存储表单内文本信息类 //设置乱码 upload.setHeaderEncoding("UTF-8"); 完善细节 1. 设置保存上传文件的服务器目录 1. 解决上传文件名是中文的问题,通过item.getName()获取到文件的名称 1. 直接将其改名,不用原来的名字 2. 保存其中文的名字(注意,一般如果是压缩文件供下载的资源,则可以考虑保留其中文名称,否则一般图片直接展示用的,不建议用中文名来保存) |
思考题:文件名重复了怎么办?
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 问题:覆盖 解决方案: 客户端参与 1,方案一:做个文件名的唯一性校验,告诉客户端,这个文件名已经存在(不建议) 服务端解决 1,方案二:重新取个名字(唯一性:时间、UUID)---图片资源 利用时间保证唯一性:System.currentTimeMillis() 利用UUID保证唯一性: 2,方案三:下载电影压缩包,水野朝阳.zip 保留原有的名字 2016\10\18\103819\3天精通Java |
获取完整的表单数据
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 保存一个完整的表单信息,除了将文件上传到服务器以外,还需要将其他表单项信息保存到对象,并存储到数据中心,而对应的图片信息则保存为保存的路径即可。 那么怎么获取到其他的表单项数据?item.getFileName(),item.getString() 为了更好完成对其他表单项的值的获取,需要借助另一个开源框架 BeanUtils 它除了自身的jar包,还依赖于commons-logging.jar 细节: 有复选框的情况怎么办? |
多文件上传案例
|---------------------------------------------------------------------------------------|
| 实现多文件的批量上传 Ps:展示图片-"upload" + File.separator + datePath + File.separator + filename); |
文件下载
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 主要实现方式有两种 1. 超链接下载 2. 以超练级的方式下载压缩文件 3. 以超链接的方式下载图片文件 4. 以超链接的方式下载中文文件名的文件 5. Servlet下载 有些超链接搞不定的事情就交给Servlet来搞定 采用流的方式来读和写 设置响应的头部信息(告诉客户端是以附件的形式下载) response.setHeader("Content-disposition", "attachment;fileName="+fileName); 细节: 下载的文件名是中文怎么办? |