javaweb的上传和下载

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作用是一致的)
可选值有:

  1. 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:弹出对话框让用户下载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值