学习文件上传和下载

文件上传下载

文件上传

文件上传的应用

比如个人信息的管理,上传头像

比如商品信息的管理,上传商品的图片

这些都需要通过浏览器客户端将图片上传到服务器的磁盘上

文件上传原理

所谓的文件上传就是服务器端通过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);

细节:

下载的文件名是中文怎么办?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值