Java教程

java的web实现文件的上传和下载的详情

本文主要是介绍java的web实现文件的上传和下载的详情,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

浪北前言

这是我在学jsp时抽离出来的模块,文件上传和下载,把它单独拿出来写的原因是为了更加彻透的了解它!其实上传文件的组件CommonsFileUpload组件最核心的就是FileUpload类的parseRequest( request)解析请求把表单字段数据封装成FileItem对象,就不用我们去一个个的接收表单的参数了!

作为有趣的博主,我就从一篇有趣的文字开始吧。送大家一张手机的壁纸(在之前的文字中一直都是电脑的壁纸,现在由于图片比较大我就放在了文章的结尾)

前端文件表单的注意

我们上传文件一般用的就是表单,那么用于上传文件的表单需要注意以下几点!

<form enctype="multipart/form-data” method="post" >
<input  type="file" name="myfile"/>   </br>
</form>

①表单的entype必须是multipart/form-data 发送的方式必须是post

②type的类型必须是file ,并且必须带有名字,这样才方便接受input提交文件的这个参数

上传文件

使用的组件

文件上传一般都是使用表单,表单提交文件时,文件数据都是附带在HTTP请求消息体中的,并且采用MIME类型(多用途互联网邮件扩展)进行描述。在后台使用request提供的getInputStream()方法可以读取到客户端提交过来的的数据,但是由于用户可能同时提交多个文件,而在servlet端直接读取上传数据,并分别解析出相应的文件数据时一项麻烦的工作。所以Apache组织提供了开源组件Commons-FileUpload(平民-文件上传)。(在我们的传统上传文件时如果上传是单个文件,我们通常时直接用request.getInputStream(),获取这个请求中的文件的输入流,直接读出来写到文件中(并不需要获取参数),但是如果上传的是多个文件的话,那么我们就要对这个请求进行解析,这样子就很麻烦)。

注:我们在使用这个上传的组件时,要在Apache官网中下载两个jar包

**工作流程:**下图很重要,认真看完再看下面分析

在这里插入图片描述

Fileltem接口封装数据

Commons-FileUpload组件实现了Fileltem(翻译过来是文件条)接口

Fileltem的作用:封装数据,用于封装单个表单字段元素的数据 。(fileitem实现了序列化接口,所以也支持序列化)

比如:下面这个表单提交了text普通字符串字段和file文件字段,那么text的字段数据会封装为一个Fileltem对象,file字段数据会封装为一个fileitem对象。每个字段都会封装为一个Fileltem对象。

eg;
<form enctype="multipart/form-data” method="post" >
<input type="text" name="name"/>
<input  type="file" name="myfile"/>  
</form>

Fileltem类提供的方法

方法作用
1boolean isFormField()用于判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果是普通表单字段则返回true,否则返回false。因此,可以使用该方法判断是否为普通表单域,还是文件上传表单域。
2String getName()用于获得文件上传字段中的文件名,如果时普通文本表单字段返回null。注意IE或FireFox中获取的文件名是不一样的,IE中是绝对路径,FireFox中只是文件名。
3String getFieldName()方法用于返回表单标签name属性的值。即form的name值
4void write(File file)用于将FileItem对象中保存的主体内容保存到某个指定的文件中。如果FileItem对象中的主体内容是保存在某个临时文件中,该方法顺利完成后,临时文件有可能会被清除。该方法也可将普通表单字段内容写入到一个文件中,但它主要用途是将上传的文件内容保存在本地文件系统中。
5String getString()getString(),使用默认的字符编码将FileItem的主体内容转化为字符串
getString(String encoding),用参数指定字符编码FileItem的主体内容转化为字符串
7boolean isInMemory()isInMemory方法用来判断FileItem对象封装的数据内容是存储在内存中,还是存储在临时文件中,如果存储在内存中则返回true,否则返回false。
8void delete()delete方法用来清空FileItem类对象中存放的主体内容,如果主体内容被保存在临时文件中,delete方法将删除该临时文件。 尽管当FileItem对象被垃圾收集器收集时会自动清除临时文件,但及时调用delete方法可以更早的清除临时文件,释放系统存储资源。另外,当系统出现异常时,仍有可能造成有的临时文件被永久保存在了硬盘中。

这篇关于java的web实现文件的上传和下载的详情的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!