javaweb之文件上传和下载

本文详细介绍了文件上传和下载的技术实现,包括客户端如何构造上传请求、服务端如何解析及处理上传文件,以及如何实现文件的安全存储。同时,还讲解了文件下载的基本流程和技术要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、文件的上传
1.客户端上传文件:在web页面中添加上传输入项
1).file属性必须有name属性才能够提交
2).上传用的表单必须是POST提交,因为GET提交的参数将以URL编码后的方式提交,大小限制在1K
3).上传用的表单设置enctype为multipart/form-data
2.服务端接受和处理文件
通过Apache提供的Commons-fileupload实现文件上传
1).DiskFileItemFactory---文件上传工具类,用来生产文件上传核心类
public DiskFileItemFactory(int sizeThreshold,File repository);
public DiskFileItemFactory();
public void setSizeThreshold(int sizeThreshold);
如果不设置内存缓冲区大小,则默认值为10K,临时文件夹的位置和具体的操作系统有关,可以通过
System.getProperty("java.io.tmpdir")获取当前系统的默认临时文件夹的位置
2).ServletFileUpload---文件上传的核心类,可以用来解析request对象,将每个字段项或文件上传项封装为FileItem对象
组成集合后返回
常用方法:
1'.判断上传表单是否为multipart/form-data类型
boolean isMultipartContent(HttpServletRequest request)
2'.解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,返回一个保存了所有FileItem的list集合
List parseRequest(HttpServletRequest request)
3'.设置单个上传文件的最大值
setFileSizeMax(long fileSizeMax)
4'.设置上传文件总量的最大值
setSizeMax(long sizeMax)
5'.设置编码格式,解决上传文件名乱码问题
setHeaderEncoding(java.lang.String encoding)
6'.实时监听文件上传状态
setProgressListener(ProgressListener pListener)
3).FileItem---文件上传表单中,每个数据部分
常用方法:
1'.判断FileItem是一个文件上传项还是一个普通字段项
boolean isFormField();
2'.如果是普通字段项,获得普通字段项的name属性
String getFieldName();
3'.如果是普通字段项,获得普通字段项的value属性,可以用encoding进行编码设置
String getString(String encoding);
4'.如果是一个文件上传项,获得上传文件的文件名(有些浏览器会携带客户端路径)
String getName();
5'.如果是一个文件上传项,获得上传文件的输入流
InputStream getInputStream();
6'.如果是一个文件上传项,在关闭FileItem输入流后,删除临时文件
delete();  
3.分目录存储
1).同一个文件夹下的文件不能重名,此时用UUID改造文件名,使文件名独一无二
String uuidname = UUID.randomUUID().toString()+"_"+filename;
注:在IE6中,上传文件时,文件名有错误,上传的是文件的硬盘路径,要进行单独处理
filename = filename.substring(filename.lastIndexOf("\\")+1);
2).如果文件上传的目录不保护起来,用户可以上传任意的jsp文件,调用jsp文件执行任意代码,非常危险,所以应该将文件的上传
目录和临时文件目录放置在WEB-INF目录下保护起来
3).如果一个文件下文件过多,会导致访问非常缓慢,应该将上传的文件分目录存储
使用hashcode来实现分目录存储,根据文件名生成hashcode值为8位16进制表示形式,由于文件名不同,算出的hashcode基本
可以保证不会重复,在遍历这8位16进制数,每一位都生成一级目录,这样最终会有8级目录,每一级都有16个子目录。


二、文件下载
1.以流的方式或转发的方式将资源打给浏览器
2.设置Content-Disposition头设置为:attachment;filename=xxx.xx通知浏览器以附件的形式打开发送的数据;此处可以结合Content-Type头
来使用,设置Content-Type头,值为当前发送的文件的MIME类型。文件MIME类型可以servletContext.getMimeType(filename)来获取
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值