javaweb的上传和下载
一、文件的上传和下载概述(借助第三方apache的上传组件commons-fileupload实现)
前端页面必须存在的代码:
a、提供form表单,method必须是post
b、form表单的enctype属性必须是multipart/form-data
c、提供input type=”file”类的上传输入域 <input type="file" name="f">
关于enctype属性:
作用:告知服务器请求正文的MIME类型。(请求消息头:Content-Type作用是一致的)
可选值有:
application/x-www-form-urlencoded
(默认):
正文:name=admin&password=123
服务器获取数据:String name = request.getParameter(“name”);
2.multipart/form-data
:
服务器获取数据:request.getParameter(String)方法获取指定的表单字段字符内容,但文件上传表单已经不在是字符内容,而是字节内容,所以失效。
通过request对象,获取InputStream, 可以将浏览器提交的所有数据读取到.
后端参考代码:
核心API—DiskFileItemFactory
DiskFileItemFactory factory = new DiskFileItemFactory();
DiskFileItemFactory 是创建FileItem 对象的工厂,这个工厂类常用方法:
1、public void setSizeThreshold(int sizeThreshold) :设置内存缓冲区的大小,默认值为10K。当上传文件大于缓冲区大小时,fileupload组件将使用临时文件缓存上传文件。
**2、public void setRepository(Java.io.File repository) :**指定临时文件目录,默认值为System.getProperty(“java.io.tmpdir”).
3、public DiskFileItemFactory(int sizeThreshold,java.io.File repository) :构造函数
核心API—FileItem
Fileltem类,表示每一个表单项。
FileItem类的常用方法:
boolean FileItem.isFormField()
判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。
true表示普通类型的表单项
false表示上传的文件类型
String FileItem.getName();
获取上传的文件名
String FiieItem.getFieldName()
获取表单项的name属性值
void FileItem.write( file );
将上传的文件写到参数file所指向抽硬盘位置。
String FileItem.getString()
获取当前表单项的值。
1、boolean isFormField(): isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果是普通表单字段则返回true,否则返回false。
2、 String getName()
用于获得文件上传字段中的文件名。注意IE或FireFox中获取的文件名是不一样的,IE中是绝对路径,FireFox中只是文件名。
3、String getFieldName()
用于返回表单标签name属性的值。
4、 void write(File file):用于将FileItem对象中保存的主体内容保存到某个指定的文件中。如果FileItem对象中的主体内容是保存在某个临时文件中,该方法顺利完成后,临时文件有可能会被清除。该方法也可将普通表单字段内容写入到一个文件中,但它主要用途是将上传的文件内容保存在本地文件系统中。
5、 String getString():用于将FileItem对象中保存的数据流内容以一个字符串返回,它有两个重载的定义形式:
public Java.lang.String getString();
public java.lang.String getString(java.lang.String encoding) throws java.io.UnsupportedEncodingException
前者使用缺省的字符集编码将主体内容转换成字符串,后者使用参数指定的字符集编码将主体内容转换成字符串。如果在读取普通表单字段元素的内容时出现了中文乱码现象,请调用第二个getString方法,并为之传递正确的字符集编码名称。
6、 void delete():delete方法用来清空FileItem类对象中存放的主体内容,如果主体内容被保存在临时文件中,delete方法将删除该临时文件。尽管当FileItem对象被垃圾收集器收集时会自动清除临时文件,但及时调用delete方法可以更早的清除临时文件,释放系统存储资源。
核心API—-ServletFileUpload
🛰ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem 对象中。常用方法有:
1、boolean isMultipartContent(HttpServletRequest request) :判断上传表单是否为multipart/form-data类型
2、List **parseRequest(HttpServletRequest request):**解析request对象,并把表单中的每一个输入项包装成一个fileItem 对象,并返回一个保存了所有FileItem的list集合。
3、setFileSizeMax(long fileSizeMax) :设置上传文件的最大值(单个文件),用于设置单个上传文件的最大尺寸限制,以防止客户端恶意上传超大文件来浪费服务器端的存储空间。其参数是以字节为单位的long型数字。
4、setSizeMax(long sizeMax) :设置上传文件总量的最大值(所有上传文件),用于设置请求消息实体内容(即所有上传数据)的最大尺寸限制,以防止客户端恶意上传超大文件来浪费服务器端的存储空间。其参数是以字节为单位的long型数字。
5、setHeaderEncoding(java.lang.String encoding) :设置编码格式。在文件上传请求的消息体中,除了普通表单域的值是文本内容以外,文件上传字段中的文件路径名也是文本,在内存中保存的是它们的某种字符集编码的字节数组,Apache文件上传组件在读取这些内容时,必须知道它们所采用的字符集编码,才能将它们转换成正确的字符文本返回。
注意事项:
⭐️1.如果修改代码,则在tomcat重新启动时 会被删除
原因:当修改代码的时候,tomcat会重新编译一份class 并且重新部署(重新创建各种目录)
2.如果不修改代码,则不会删除
原因: 没有修改代码,class仍然是之前的class
因此,为了防止 上传目录丢失: a.虚拟路径 b.直接更换上传目录 到非tomcat目录
限制上传:
类型:
String ext=filename.substring(filename.indexOf(".")+1);
if(!(ext.equals("jpg")||ext.equals("png")||ext.equals("gif"))) {
System.out.println("图片格式有误!格式只能是 png gif jpg");
}
大小:
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(factory);
factory.setSizeThreshold(1024000);//设置临时的缓冲文件大小为1000
factory.setRepository(new File("D:\\java\\uploadtemp"));//设置临时文件的目录
upload.setSizeMax(1048576);//控制上传单个文件的大小 1M ServletFileUpload
注意 对文件的限制条件 写再parseRequest之前
2.下载:不需要依赖任何jar
a.请求(地址a form),请求Servlet
b.Servlet通过文件的地址 将文件转为输入流 读到Servlet中
c.通过输出流 将 刚才已经转为输入流的文件 输出给用户
注意:下载文件 需要设置2个 响应头:
response.addHeader(“content-Type”,“application/octet-stream” );//MIME类型:二进制文件(任意文件)
response.addHeader(“content-Disposition”,“attachement;filename=”+fileName );//fileName包含了文件后缀:abc.txt
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtHWTA8q-1602117444708)(C:\Users\Administrator\Desktop\javaweb笔记\javaweb图片\MIME.png)]
Content-Disposition 属性是作为对下载文件的一个标识字段,Content-Disposition属性有两种类型:inline 和 attachment 。
inline :将文件内容直接显示在页面;attachment:弹出对话框让用户下载。
sposition 属性是作为对下载文件的一个标识字段,Content-Disposition属性有两种类型:inline 和 attachment 。
inline :将文件内容直接显示在页面;attachment:弹出对话框让用户下载。