文件上传

文件上传:要将客户端(浏览器)大数据存储到服务器端,不将数据直接存储到数据库中,而是要将数据存储到服务器所在的磁盘上,这就要使用文件上传。

关于文件上传的例子在应用中非常常见,就比如很多网站的上传头像,则属于图片上传,还有些可以上传word或者Excel文件等等。
服务器端通过request对象获取输入流从而将浏览器上传的数据读取出来,实现文件的上传。
文件上传的三要素:
1.表单提交必须是post提交
2.需要使用组件<input type="file" name="fileName">
3.表单必须设置enctype=”multipart/form-data”

enctype属性

作用:告知服务器请求正文的MIME类型(简要理解为文件的类型,与请求消息头:Content-Type作用是一致的)
可选值:

  • application/x-www-form-urlencoded(默认):

    正文:name=admin&password=123
    服务器获取数据:String name = request.getParameter("name");
    
  • multipart/form-data:


    其中boundary是浏览器会随机生成的分隔符,用来区分提交的数据。上图中我们可以看出是有两部分数据,一种是普通的文本输入框,用户的输入是“admin”,第二种是文件上传框,用户上传的文件是a.txt,文件类型Content-Type是text/plain,文本类型。其中文件的内容是“aaaaaaaaaaaa”

新手可能犯的小错误:
×.表单未设置enctype,服务器端可以通过request.getParameter(“name”)获取表单数据,如果用户上传的是文件,则只能获取文件的名称,而不能获取文件的内容。
×.表单实现了文件上传的三要素,但是服务器端仍想使用request.getParameter(“name”)获取上传文件及表单的数据,这种情况下均获得null值,是字符串‘null’。这是因为服务器获取数据:request.getParameter(String)方法获取指定的表单字段字符内容,但文件上传表单已经不在是字符内容,而是字节内容,所以失效。
对于文件上传,如果有中文,此时设置request.setCharacterEncoding(“UTF-8”);也无效了,仍然会出现乱码。



文件上传通过字节流读取后结果如下:
这里写图片描述
现在的关键就是如何将我们所需要的数据提取出来,这也是文件上传的关键部分
文件上传:解析请求正文的每部分的内容。
当然,我们可以自己写方法实现,通过分隔符去提取内容。
但是我们可以借助第三方的上传组件实现文件上传

commons-fileupload:Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件,它最主要的工作就是帮我们解析request.getInputStream()。

导入commons-fileupload相关jar包
commons-fileupload.jar,核心包;
commons-io.jar,依赖包。
核心类:
DiskFileItemFactory、ServletFileUpload、FileItem
解析原理:
这里写图片描述
使用fileupload组件的步骤如下:
1.创建工厂类DiskFileItemFactory对象:
DiskFileItemFactory factory = new DiskFileItemFactory()
2.使用工厂创建解析器对象:
ServletFileUpload fileUpload &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值