阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

上传文件

389次阅读
没有评论

共计 4119 个字符,预计需要花费 11 分钟才能阅读完成。

1、文件上传的作用

例如网络硬盘!就是用来上传下载文件的。

往百度网盘上传一个文件就是文件上传。

2、文件上传对页面的要求

上传文件的要求比较多,需要记一下:

  • 必须使用表单,而不能是超链接;
  • 表单的 method 必须是 POST,而不能是 GET;
  • 表单的 enctype 必须是 multipart/form-data;
  • 在表单中添加 file 表单字段,即 <input type=”file”…/>

例如:

<form action="${pageContext.request.contextPath}/FileUploadServlet" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="username"/><br/> 文件 1:<input type="file" name="file1"/><br/> 文件 2:<input type="file" name="file2"/><br/> <input type="submit" value="提交"/> </form>

3、文件上传对 Servlet 的要求

当提交的表单是文件上传表单时,那么对 Servlet 也是有要求的。

首先我们要肯定一点,文件上传表单的数据也是被封装到 request 对象中的。

**request.getParameter(String)** 方法获取指定的表单字段字符内容,但文件上传表单已经不在是字符内容,而是字节内容,所以失效。

这时可以使用 request 的 getInputStream() 方法获取 ServletInputStream 对象,它是 InputStream 的子类,这个 ServletInputStream 对象对应整个表单的正文部分(从第一个分隔线开始,到最后),这说明我们需要的解析流中的数据。当然解析它是很麻烦的一件事情,而 Apache 已经帮我们提供了解析它的工具:commons-fileupload。

可以尝试把 request.getInputStream() 这个流中的内容打印出来看看

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {InputStream in = request.getInputStream(); String s = IOUtils.toString(in); // 使用 apache 的 commons 的 io 组件,把流中的数据读取出来转换成字符串 System.out.println(s); }
-----------------------------7ddd3370ab2
Content-Disposition: form-data; name="username"

hello
-----------------------------7ddd3370ab2
Content-Disposition: form-data; name="file1"; filename="a.txt"
Content-Type: text/plain

aaa
-----------------------------7ddd3370ab2
Content-Disposition: form-data; name="file2"; filename="b.txt"
Content-Type: text/plain

bbb
-----------------------------7ddd3370ab2--

4、commons-fileupload 工具介绍

4.1、fileupload 概述

fileupload 是由 apache 的 commons 组件提供的上传组件。它最主要的工作就是帮我们解析 request.getInputStream()。

fileupload 组件需要的 JAR 包有:

  • commons-fileupload.jar,核心包;

  • commons-io.jar,依赖包。

4.2、fileupload 简单应用

fileupload 的核心类有:DiskFileItemFactory、ServletFileUpload、FileItem。

使用 fileupload 组件的步骤如下:

  • 创建工厂类 DiskFileItemFactory 对象:DiskFileItemFactory factory = new DiskFileItemFactory()

  • 使用工厂创建解析器对象:ServletFileUpload fileUpload = new ServletFileUpload(factory)

  • 使用解析器来解析 request 对象:List list = fileUpload.parseRequest(request)

隆重介绍 FileItem 类,它才是我们最终要的结果。一个 FileItem 对象对应一个表单项(表单字段)。一个表单中存在文件字段和普通字段,可以使用 FileItem 类的 isFormField() 方法来判断表单字段是否为普通字段,如果不是普通字段,那么就是文件字段了。

  • String getName():获取文件字段的文件名称;

  • String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件;

  • String getFieldName():获取字段名称,例如:,返回的是 username;

  • String getContentType():获取上传的文件的类型,例如:text/plain。

  • int getSize():获取上传文件的大小;

  • boolean isFormField():判断当前表单字段是否为普通文本字段,如果返回 false,说明是文件字段;

  • InputStream getInputStream():获取上传文件对应的输入流;

  • void write(File):把上传的文件保存到指定文件中。

4.3、简单上传示例

写一个简单的上传示例:

  • 表单包含一个用户名字段,以及一个文件字段;

  • Servlet 保存上传的文件到 uploads 目录,显示用户名,文件名,文件大小,文件类型。

第一步:

完成 index.jsp,只需要一个表单。注意表单必须是 post 的,而且 enctype 必须是 mulitpart/form-data 的。

<form action="${pageContext.request.contextPath}/FileUploadServlet" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="username"/><br/> 文件 1:<input type="file" name="file1"/><br/> <input type="submit" value="提交"/> </form>

第二步:

完成 FileUploadServlet

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 因为要使用 response 打印,所以设置其编码 response.setContentType("text/html;charset=utf-8"); // 创建工厂 DiskFileItemFactory dfif = new DiskFileItemFactory(); // 使用工厂创建解析器对象 ServletFileUpload fileUpload = new ServletFileUpload(dfif); try {// 使用解析器对象解析 request,得到 FileItem 列表 List<FileItem> list = fileUpload.parseRequest(request); // 遍历所有表单项 for(FileItem fileItem : list) {// 如果当前表单项为普通表单项 if(fileItem.isFormField()) {// 获取当前表单项的字段名称 String fieldName = fileItem.getFieldName(); // 如果当前表单项的字段名为 username if(fieldName.equals("username")) {// 打印当前表单项的内容,即用户在 username 表单项中输入的内容 response.getWriter().print("用户名:" + fileItem.getString() + "<br/>"); } } else {// 如果当前表单项不是普通表单项,说明就是文件字段 String name = fileItem.getName();// 获取上传文件的名称 // 如果上传的文件名称为空,即没有指定上传文件 if(name == null || name.isEmpty()) {continue; } // 获取真实路径,对应 ${项目目录}/uploads,当然,这个目录必须存在 String savepath = this.getServletContext().getRealPath("/uploads"); // 通过 uploads 目录和文件名称来创建 File 对象 File file = new File(savepath, name); // 把上传文件保存到指定位置 fileItem.write(file); // 打印上传文件的名称 response.getWriter().print("上传文件名:" + name + "<br/>"); // 打印上传文件的大小 response.getWriter().print("上传文件大小:" + fileItem.getSize() + "<br/>"); // 打印上传文件的类型 response.getWriter().print("上传文件类型:" + fileItem.getContentType() + "<br/>"); } } } catch (Exception e) {throw new ServletException(e); } }

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-06发表,共计4119字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7822519
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛 NAS-1:安装飞牛 NAS 前言 在家庭和小型工作室场景中,NAS(Network Atta...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...