当前位置:首页 > 技术知识 > 正文内容

Java文件上传是如何实现的?_java文件上传是如何实现的呢

maynowei8个月前 (10-23)技术知识118

在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面。需要注意的是,为了使Servlet程序可以获取到上传文件的数据,需要将表单页面的method属性设置为post方式,enctype属性设置为“multipart/form-data”类型,添加文件的input标签类型设置为file类型。示例如下:

<%--指定表单数据的 enctype 属性以及提交方式 --%>
<form enctype="multipart/form-data" method="post">
<%-- 指定标记的类型和普通表单的名称 --%>
用户名:<input type="text" name="name"/><br/>
<%--指定标记的类型和文件域的名称--%>
选择上传文件:<input type="file" name="myfile"/><br/>

当浏览器通过表单提交上传文件时,由于文件数据都附带在HTTP请求消息体中,并且采用MIME类型(多用途互联网邮件扩展类型)进行描述。因此,浏览器发送给服务器的HTTP消息比较特殊,具体示例如下:

multipart/form-data;boundary=----------------------------7dfa7a30650
----------------------------7dfa7a30650
Content-Disposition: form-data;name="name"

itcast
----------------------------7dfa7a30650
Content-Disposition: form-data;name="myfile";filename="uploadfile.txt"
Content-Type: text/plain
www.itcast.cn
----------------------------7dfa7a30650--

从上面的表单请求正文可以看出,请求正文分为多个部分,解析这部分内容比较麻烦。为此,Apache组织提供了一个开源组件Commons-FileUpload,该组件可以方便地将“multipart/form-data”类型请求中的各种表单域解析出来,并实现一个或多个文件的上传,同时也可以限制上传文件的大小等内容,并且性能优异,使用极其简单。需要注意的是,在使用FileUpload组件时,需要导入commons-fileupload和commons-io两个jar包。

为了大家更好地理解FileUpload组件是如何实现文件的上传功能,接下来,打开FileUpload组件的帮助文档,查看其实现方式,具体如图6-1所示。

从图1中可以看出,FileUpload组件也是通过Servlet来实现文件上传功能的。其工作流程如图2所示。

从图2中可以看出,实现文件的上传会涉及到几个陌生类,这些类都是Apache组件上传文件的核心类。关于这些核心类的相关知识,将在下面的小节进行详细讲解。

课程推荐:

JavaWeb教程|JavaWeb网上图书商城完整项目

Maven教程_Maven视频教程|黑马程序员

深度掌握Springboot实践技术教程

相关文章

2018年度回顾:挖矿木马为什么会成为病毒木马黑产的中坚力量

一、概述根据腾讯御见威胁情报中心监测数据,2018年挖矿木马样本月产生数量在百万级别,且上半年呈现快速增长趋势,下半年上涨趋势有所减缓。由于挖矿的收益可以通过数字加密货币系统结算,使黑色产业变现链条十...

Android监听滚动视图(监听页面滚动)

Android UI Libs之Android-ObservableScrollView1. 说明Android-ObservableScrollView,顾名思义,Android上观察滚动的视图,可...

Linux系统编程:条件变量为什么要用锁

条件变量可以解决线程同步和共享资源访问的问题,条件变量是对互斥锁的补充,它允许一个线程阻塞并等待另一个线程发送的信号,当收到信号时,阻塞的线程被唤醒并试图锁定与之相关的互斥锁。具体定义如下:等待:in...

大厂 Go 编程规范(二):mutex(编程大厂是什么意思)

mutex 是golang 的互斥锁,可以保障在多协程的情况下,数据访问的安全。1、零值有效我们并不需要mutex指针mu := new(sync.Mutex) mu.Lock()直接可以使用mute...

什么?Java 中的锁还有状态?(java中的锁都有哪些类型)

线程如果锁住了某个资源,致使其他线程无法访问的这种锁被称为悲观锁,相反,线程不锁住资源的锁被称为乐观锁,而自旋锁是基于 CAS 机制实现的,CAS又是乐观锁的一种实现,那么对于锁来说,多个线程同步访问...

Oracle高级数据库特性揭秘:存储过程、触发器与权限管理

当谈论Oracle高级数据库特性时,存储过程和函数、触发器、权限管理和安全性以及数据库连接和远程访问是关键概念。下面我将为每个主题提供详细的解释,并附上高质量示例。存储过程和函数: 存储过程和函数是预...