文件的上传与下载

2023-11-18

一.文件上传

文件上传程序步骤

1.如何在web页面中添加上传输入项?

<input type=“file”>标签用于在web页面中添加文件上传输入项,设置文件上传输入项时须注意:
1)、 必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。
2)、必须 把form的enctype属值设为multipart/form-data.设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。
3)、表单的 提交方式要是post


2、服务器端 Servlet读取上传文件内容,保存到服务器端



常见问题:

1、表单控件没写name属性 ----- 上传文件数据不会提交
2、表单没有设置enctype  enctype="application/x-www-form-urlencoded"
upload=C%3A%5CDocuments+and+Settings%5Cseawind%5C%E6%A1%8C%E9%9D%A2%5C2012%E5%B9%B42%E6%9C%8810%E6%97%A5%E7%8F%AD%5Cj2ee6_docs.chm
* 此时 请求数据包中 没有上传文件数据的
upload=C%3A%5CDocuments+and+Settings%5Cseawind%5C%E6%A1%8C%E9%9D%A2%5C2012%E5%B9%B42%E6%9C%8810%E6%97%A5%E7%8F%AD%5Cday20%5C%E7%AC%94%E8%AE%B0.txt


上传文件请求体格式

当使用enctype后 --- multipart/form-data

上传文件请求体 采用MIME消息格式   格式如下:


-----------------------------7dc2fd10407a8
Content-Disposition: form-data; name="username"


寮犱笁
-----------------------------7dc2fd10407a8
Content-Disposition: form-data; name="upload"; filename="C:\Documents and Settings\seawind\妗岄潰\info.txt"
Content-Type: text/plain


Iam ok!
today is sunny!
很好!
-----------------------------7dc2fd10407a8--


通过request.getInputStream 获得请求体中包含数据


解析上传文件数据

分析原理之后 需要使用开源技术来解决

1、JSP Smart-upload (产生于JSP盛行时代 Model1)
2、 commons-fileupload --- Apache commons项目中一个子项目
      * upload jar 依赖 io包 ---- commoms-io

       共需要导入两个jar包: Commons-fileuploadcommons-io 


上传Servlet

创建文件项 工厂 FileItemFactory 

此工厂类常用的方法:
1、SizeThreshold 设置内存缓冲区大小
上传文件时,文件首先是要保存在服务器内存缓冲区内 
例如:缓冲区64m  上传200m文件 ---- 将内存缓冲区中数据,保存到硬盘上形成临时文件
2、Repository 设置临时目录


创建解析器 ServletFileUpload

1、 解析request数据

parseRequest ---- FileItem的List       

 什么是FileItem ----- MIME BodyPart

2、遍历List,寻找哪个是上传文件的FileItem
if(!fileItem.isFormField()){// 如果文件项不是一个简单表单域,他就是一个上传文件
}

文件上传API图解:


代码示例:

上传文件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>
<h1>文件上传 form 表单</h1>
<form action="upload4" method="post" enctype="multipart/form-data">
	用户名<input type="text" name="username" /><br/>
	上传文件<input type="file" name="upload"/> <!-- 以post提交 数据在请求体中 -->
	<input type="submit" />
</form>
</body>
</html>


上传文件servlet示例:

package cn.servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.servlet.ServletException;
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;

public class UploadServlet2 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 使用file upload 技术 进行文件上传

		// 创建文件项工厂
		DiskFileItemFactory factory = new DiskFileItemFactory(); // 目的:存放

		// 创建ServletFileUpload
		ServletFileUpload servletFileUpload = new ServletFileUpload(factory); // 解析器

		// 解析
		try {
			// 获得文件项列表 -- 每一个文件项相当于 一个上传表单组件
			List<FileItem> fileItems = servletFileUpload.parseRequest(request);
			System.out.println(fileItems.size());

			// 查找哪个是上传文件项
			for (FileItem fileItem : fileItems) {
				// 判断fileItem是上传文件
				if (!fileItem.isFormField()) {
					// 上传文件
					InputStream in = fileItem.getInputStream();
					String fileName = fileItem.getName();
					int index = fileName.lastIndexOf("\\");
					if (index != -1) {
						// 截取文件名
						fileName = fileName.substring(index + 1);
					}

					FileOutputStream out = new FileOutputStream("c:\\"
							+ fileName);
					int temp;
					while ((temp = in.read()) != -1) {
						out.write(temp);
					}
					in.close();
					out.close();
				}
			}

		} catch (FileUploadException e) {
			e.printStackTrace();
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}



若干注意问题:

* 文件上传解析之前 需要先判断 该表单是否为文件上传表单 enctype="multipart/form-data"
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
* 对于 上传文件名中文乱码解决 setHeaderEncoding(java.lang.String encoding)
* 监听文件上传过程 setProgressListener(ProgressListener pListener) ------ 开发中结合AJax一起使用 进度条
* 如果form使用文件上传格式multipart ,此时不能再使用request.getParameter获得数据了
   使用 getString
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文件的上传与下载 的相关文章

  • PyTorch深度学习实践笔记#8

    嗨 我是error 我来记录PyTorch深度学习实践的笔记了 这会是这个系列的最后一篇文章 个人之前都是使用tensorflow进行深度学习实践 这是第一次学习Pytorch 若笔记有误欢迎提出纠正 课件采用自B站 刘二大人 老师的视频

随机推荐

  • Latex常用数学公式整理——矩阵

    文章目录 1 简单矩阵 2 复杂矩阵 1 简单矩阵 带 的矩阵 begin pmatrix 0 0 0 0 1 0 0 0 0 end pmatrix 0
  • Jaspersoft 环境搭建和入门简单实例

    JasperReport简介 JasperReport是一个强大 灵活的报表生成工具 能够展示丰富的页面内容 并将之转换成PDF HTML 或者XML格式 该库完全由Java写成 可以用于在各种Java应用程序 包括J2EE Web应用程序
  • BFS(广度优先算法)——判断无向简单图中任意两点是否连通

    include
  • dojo SplitContainer

    SplitContainer author amushen email amushen yahoo com cn qq 38371354 相关的文件 dojo widget LayoutContainer dojo widget HtmlW
  • Pytorch2.0中compiled_model=torch.compile(model) 的正确添加位置

    今天pytorch官网更新了pytorch2 0稳定版 迫不及待的我直接更新了 确实像官方所说 只需加入model torch compile model 一行代码即可加速 加入的位置如下 cpu训练 model UNet deep sup
  • 混杂设备与字符设备的区别----misc_register、 register_chrdev 的区别总结

    杂项设备 misc device 杂项设备也是在嵌入式系统中用得比较多的一种设备驱动 在 Linux 内核的include linux目录下有Miscdevice h文件 要把自己定义的misc device从设备定义在这里 其实是因为这些
  • openstack开发实践(一):devstack搭建all-in-one的openstack开发环境

    Devstack简介 devstack是面向开发者的一个openstack部署工具 用户可以指定不同的版本分支进行安装 devstack借助于Shell脚本实现openstack自动化部署 devstack源码中的stack sh即为安装脚
  • Python基于控制台的学生管理系统

    encoding utf 8 定义一个函数 显示可以使用的功能列表给用户 def showInfo print 30 print 学生管理系统 v1 0 print 1 添加学生的信息 print 2 删除学生的信息 print 3 修改学
  • MIPI信号的分析--结合示波器实际测试波形

    如果排查的思路对你有帮助 请记住 消雨匆匆 码字和排查很累 仅此而已 硬件不是抄电路 拿烙铁 懂点软件 细致分析 找问题和破案搜集线索是一样的 PS 硬件知识也可以性感 部分内容来自于此博客的大神总结 http www elecfans c
  • Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换

    场景 Java GeoTools 开源的Java GIS工具包 快速入门 实现读取shp文件并显示 Java GeoTools 开源的Java GIS工具包 快速入门 实现读取shp文件并显示 霸道流氓气质的博客 CSDN博客 在上面实现J
  • 数字人+ChatGPT强强联手能擦出什么火花?

    随着元宇宙概念的快速发展 以数字人 ChatGPT为形式的创作方式正在颠覆传统视频创作方式 并在市场上呈现快速增长的态势 根据新榜的报道 目前已经有多位大V使用虚拟数字人来协助完成短视频制作 并且值得一提的是 这些视频并没有因为采用数字人而
  • 定时器编码器AB相电机测速( 补充)

    TIM编码器AB相电机测速 定时器编码器AB相电机测速 1 四倍频 2 算法应用 3 stm32硬件连接 3 stm32环境配置端口配置 3 C语言实现编码器个数读取 3 C语言实现编码器个数转换为速度 定时器编码器AB相电机测速 1 四倍
  • vue3配置eslint 出现问题

    vue3配置eslint 出现问题 标题必须使用导入来加载 ES 模块 ESlint Error Must use import to load ES Module 加上这一行即可
  • Jmeter之ForEach控制器

    场景运用 ForEach控制器一般和用户自定义变量或者正则表达式提取器一起使用 其在用户自定义变量或者从正则表达式提取器的返回结果中读取一系列相关的变量 该控制器下的采样器或者控制器都会被执行一次或多次 每次读取不同的变量值 需求2 有一组
  • 学习java随堂练习-20220609

    学习Java的第八天 第1题 第2题 第3题 第4题 第5题 今天是学习Java的第八天 5道练习题 第1题 题目 1 循环输入近6年某高校的录取分数 求出平均分和最低分 运行结果 代码如下 循环输入近6年某高校的录取分数 求出平均分和最低
  • PHP操作Excel

    头 header Content Type application vnd ms excel header Content Disposition attachment filename sample xls header Pragma n
  • 时序预测

    时序预测 MATLAB实现DNN全连接神经网络时间序列预测 目录 时序预测 MATLAB实现DNN全连接神经网络时间序列预测 基本介绍 模型研究 程序设计 学习总结 参考资料 基本介绍 DNN的结构不固定 一般神经网络包括输入层 隐藏层和输
  • 传指针和传引用的区别以及指针和引用的区别

    一 引用 引用的定义 引用是给另外一个变量其别名 所以引用不会分配内存空间 引用是引入了对象的一个同义词 例如 Point pt1 10 10 Point pt2 pt1 上述的代码 定义了pt2为pt1的引用 通过这样的定义 pt2和pt
  • 让生产活动更高效,物料管理场景的RPA应用

    作为制造业 供应链领域常见环节 物料管理 Material Management 通常是对企业生产经营活动所需各种物料的采购 验收 供应 保管 发放 使用等一系列计划与控制活动的总称 物料管理科学与否 将会影响到组织各职能部门间的协调 生产
  • 文件的上传与下载

    一 文件上传 文件上传程序步骤 1 如何在web页面中添加上传输入项