[原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

时间:2021-08-21 10:00:44

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.基于表单的文件上传

  1)如果在表单中使用表单元素 <input type=“file” />,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件:

  [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件      [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

  2)Enctype 属性

  ① 当表单需要上传文件时,需指定表单 enctype 的值为 multipart/form-data

  ② 在 form 元素的语法中,enctype 属性指定将数据发送到服务器时浏览器使用的编码类型

  ③ enctype 属性取值:

    > application/x-www-form-urlencoded:表单 enctype 属性的默认值。这种编码方案使用有限的字符集,当使用了非字母和数字时,必须用”%HH”代替(H 代表十六进制数字)。对于大容量的二进制数据或包含非 ASCII 字符的文本来说,这种编码不能满足要求

    > multipart/form-data:form 设定了enctype=“multipart/form-data”属性后,表示表单以二进制传输数据

  3)总结:进行文件上传时,表单需要做的准备

   ① 请求请求方式为 post  :<form action="uploadServlet" method="post"   ....... >

   ② 使用file 表单域  File:<input type="file" name="file"/>

   ③ 使用请求编码方式 : enctype="multipart/form-data"

   ④ 在服务端不能再使用 request.getParameter() 等方式获取请求信息。获取不到,因为请求的编码方式已经为multipart/form-data ,以二进制的方式来提交请求信息,可以使用输入流的方式来获取请求信息

upload.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <form action="uploadServlet" method="post" enctype="multipart/form-data">
File:<input type="file" name="file"/>
<br><br>
Desc:<input type="text" name="desc"/>
<br><br>
<input type="submit" value="submit"/>
</form> </body>
</html>

UploadServlet.java

 package com.jason.fileupload;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* Servlet implementation class UploadServlet
*/
@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求信息
// String file = request.getParameter("file");
// String desc = request.getParameter("desc");
//
// System.out.println(file);
// System.out.println(desc); //以流的方式处理 上传的代码
InputStream in = request.getInputStream(); Reader reader = new InputStreamReader(in);
BufferedReader bufferedReader = new BufferedReader(reader); String str = null; while((str = bufferedReader.readLine()) != null){
System.out.println(str);
} } }

2.使用fileuoload 组件

  1)环境的搭建:加入jar包到 lib目录

  [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

  2)基本思想:

  ① commons-fileupload 可以解析请求,得到一个FileItem 对象组成的List

   ② commons-fileupload 把请求的信息都解析为FileItem 对象,无论是一个一般的文本域还是一个文件域

  ③ 可以调用 FileItem 的 isFormField() 方法来判断是一个表单域 或不是表单域(则是一个文件域)

  ④ 进一步获取信息

    

 // Process a regular form field
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
...
}

 

 // Process a file upload
if (!item.isFormField()) {
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
...
}

  3) 如何得到List<FileItem> 对象

简单方式:

 // Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory(); // Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory); // Parse the request
List /* FileItem */ items = upload.parseRequest(request);

复杂方式:可以对文件的上床加入限制条件和其他属性

 // Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints
factory.setSizeThreshold(yourMaxMemorySize);//设置内存中最多可以存放的上传的文件的大小,若超出则把文件写到一个临时文件夹中,以 byte 为单位
factory.setRepository(yourTempDirectory);//设置那个临时文件夹 // Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint
upload.setSizeMax(yourMaxRequestSize);//设置整个文件的大小 // Parse the request
List /* FileItem */ items = upload.parseRequest(request);

helloword.java测试

 package com.jason.fileupload;

 import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload; /**
* Servlet implementation class UploadServlet
*/
@WebServlet("/upload/uploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 1.得到FileIrem 的集合 items
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints
factory.setSizeThreshold(1024 * 500);
File tempDirectory = new File("e:\\tempDirectory");
factory.setRepository(tempDirectory); // Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint
upload.setSizeMax(1024 * 1024 * 5); // Parse the request
try {
List<FileItem> items = upload.parseRequest(request);
// 2.遍历items:若是一般表单域,打印信息
for (FileItem item : items) {
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
System.out.println(name + " : " + value);
} else {
// 3.若是文件域则把文件保存到目录 files
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
long sizeInBytes = item.getSize(); System.out.println(fieldName);
System.out.println(fileName);
System.out.println(contentType);
System.out.println(sizeInBytes); InputStream in = item.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
fileName = "e:\\file\\" + fileName;
System.out.println(fileName); OutputStream out = new FileOutputStream(fileName);
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.close();
in.close();
}
} } catch (FileUploadException e) {
e.printStackTrace();
} } }

upload.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <form action="uploadServlet" method="post" enctype="multipart/form-data">
File:<input type="file" name="file"/>
<br><br>
Desc:<input type="text" name="desc"/>
<br><br>
<input type="submit" value="submit"/>
</form> </body>
</html>

[原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件的更多相关文章

  1. &lbrack;原创&rsqb;java WEB学习笔记34:Session 案例 之 解决表单重复提交

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. &lbrack;原创&rsqb;java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. &lbrack;原创&rsqb;java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作&lpar; 查看 &sol; 删除&sol; 添加&rpar; 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. &lbrack;原创&rsqb;java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. &lbrack;原创&rsqb;java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. Struts2文件上传(基于表单的文件上传)

    •Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目   •Commons-Fil ...

  7. &lbrack;原创&rsqb;java WEB学习笔记72:Struts2 学习之路-- 文件的上传下载,及上传下载相关问题

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. &lbrack;原创&rsqb;java WEB学习笔记50:文件上传案例

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. &lbrack;原创&rsqb;java WEB学习笔记41:简单标签之带属性的自定义标签&lpar;输出指定文件,计算并输出两个数的最大值 demo&rpar;

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. java如何跳出多重嵌套循环

    Java里的break能跳出循环但是只能跳出一个,goto这个在java中也只是被当作关键是,没有任何作用 要做到跳出多重嵌套循环,可以用此方法 在循环体开头设置一个标志位,设置一个标记,然后使用带此 ...

  2. C&num;基础-Func&comma;Action

    Func,Action 的介绍及其用法 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如 ...

  3. 接口(interface)

    接口(interface) 接口(interface)定义了一个可由类和结构实现的协定.接口可以包含方法.属性.事件和索引器.接口不提供它所定义的成员的实现-它仅指定实现该接口的类或结构必须提供的成员 ...

  4. 捉虫记2:windows程序句柄泄露的上下文环境

    作为程序员,开发程序是基本功,而调试程序也是必不可少的技能之一.软件在主体功能开发完成后会经历各个阶段的测试,才会被发布.在测试过程中,出现较多的可能就是内存泄漏,句柄泄漏,异常崩溃等属于非功能型的软 ...

  5. Android编译过程详解(三)

    前面两节讲解了自定义Android编译项和创建Product产品配置文件,除了编译和定义产品相关环境变量外,还需要定义Board相关环境变量. 1. build/core/config.mk 109 ...

  6. 关于win10系统1709版本安装JDK出现变量配置正确但仍有&OpenCurlyDoubleQuote;java不是内部或外部命令”的解决办法

    背景:联想拯救者R720笔记本,系统一键还原了,需要重新安装一部分软件,最基本的就是JDK,但今天在安装时遇到了问题,之前安装的1.8版本,没有仔细配置环境变量,这一次安装的是1.7版本的,仔仔细细配 ...

  7. docker相关操作文章整理

    docker整理: 菜鸟教程的nginx操作链接(docker安装完毕安装nginx启动错误,可以看下面的文章) CSDN基于 Docker 安装 Nginx docker 部署springboot

  8. jquery &dollar;&lpar;&quot&semi;&lbrack;id&dollar;&equals;&&num;39&semi;d&&num;39&semi;&rsqb;&quot&semi;&rpar;&period;val&lpar;&rpar;&semi;这句话什么意思?

    获得id后缀为d字符的值.应该是属于input标签.谢谢 匹配给定的属性是以某些值结尾的元素,比如<span id="ad">test</span>< ...

  9. python 全栈开发,Day126&lpar;创业故事&comma;软件部需求&comma;内容采集&comma;显示内容图文列表&comma;MongoDB数据导入导出JSON&rpar;

    作业讲解 下载代码: HBuilder APP和flask后端登录 链接:https://pan.baidu.com/s/1eBwd1sVXTNLdHwKRM2-ytg 密码:4pcw 如何打开APP ...

  10. OS之内存管理 ---基本的内存管理策略(一)

    基本概念 基本硬件 CPU可以直接访问的通用存储只有内存和处理器的内置的寄存器.机器指令可以用内存地址作为参数,而不能用磁盘地址作为参数.所以执行指令以及指令使用的数据,应在这些可执行访问的存储设备上 ...