jsp 文件上传操作
文件上传
1:完成一个文件上传的功能
index.jsp
注意更换form表单的enctype
enctype就是encodetype就是编码类型的意思。
multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。
需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。
application/x-www-form-urlencoded不是不能上传文件,是只能上传文本格式的文件,multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。
下面是扩展:
一、关于HTML <form> 标签的 enctype 属性
application/x-www-form-urlencoded:在发送前编码所有字符(默认)
multipart/form-data: 不对字符编码,或在使用包含文件上传控件的表单时,必须使用该值。
text/plain:空格转换为 "+" 加号,但不对特殊字符编码。
二、enctype:规定了form表单在发送到服务器时候编码方式,有如下的三个值。
1、application/x-www-form-urlencoded。默认的编码方式。但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得 效率低下。
2、multipart/form-data 。 指定传输数据为二进制类型,比如图片、mp3、文件。
3、text/plain。纯文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="FileServlet" method="POST" enctype="multipart/form-data">
<table>
<tr>
<td>
name:
</td>
<td>
<input name="user">
</td>
</tr>
<tr>
<td>
password:
</td>
<td>
<input name="pwd">
</td>
</tr>
<tr>
<td>
</td>
<td>
<input type="file" name="file">
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="上传">
</td>
</tr>
</table>
</form>
</body>
</html>
FileServlet.java
注意我这里用版本是3.0
@MultipartConfig 这个注解很重要 表示当前serlvet支持文件操作
package com.web; import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part; @WebServlet("/FileServlet")
@MultipartConfig
public class FileServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;utf-8"); //接收参数
//文件描述
String name=request.getParameter("name");
String pwd=request.getParameter("password");
/*String files=request.getParameter("file");
System.out.println("文件描述:"+files);*/
//接收文件 Part part=request.getPart("file");
//文件大小
//input中的name的属性名称
long size=part.getSize();
String inputNmae=part.getName();
System.out.println("文件大小:"+size);
System.out.println("input中的name的属性名称:"+inputNmae); //获得上传的文件名称
//获取报头文件描述
String header=part.getHeader("Content-Disposition"); //返回f字符所在的位置
int idx=header.lastIndexOf("filename:\\");
//filename="xxx.xxxx";xxx.xxx的位置是idx+10~header.length()-1;
String fileName=header.substring(idx+10,header.length()-1);
System.out.println("获得文件上传的名称:"+header);
System.out.println(fileName);
System.out.println("f字符所在的位置:"+idx);
System.out.println("header:"+header.length()); //获得文件内容
InputStream inputStream=part.getInputStream(); //获得文件上传的路径
String path=this.getServletContext().getRealPath("/uploadFile");
System.out.println("获得文件上传的路径:"+path); //取得上传数据的文件名
int fString=fileName.lastIndexOf("\\");
String saveFile=fileName.substring(fString+1); //获取你的文件名 //如果file不存在,在这个路径下创建文件
File file=new File(path);
if (!file.exists()) {
file.mkdirs();
} OutputStream fileWriter=new FileOutputStream(file+"\\"+saveFile);
System.out.println(fileWriter.toString());
byte[] b=new byte[1024];
int len=0;
while((len=inputStream.read(b))!=-1) {
fileWriter.write(b,0,len);
}
fileWriter.close();
}
}
2:完成多个文件上传的功能
index.jsp
前端的写法和上面相差不大
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="FilesServlet" method="POST" enctype="multipart/form-data">
<table>
<tr>
<td>
name:
</td>
<td>
<input name="user">
</td>
</tr>
<tr>
<td>
password:
</td>
<td>
<input name="pwd">
</td>
</tr>
<tr>
<td>
</td>
<td>
<input type="file" name="file">
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="上传">
</td>
</tr>
</table>
</form>
</body>
</html>
index.jsp
FileServlet.java
首先导入两个jar
commons-fileupload-1.3.1.jar(依赖下面那个)
commons-io-1.3.2.jar
package com.web; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
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; @WebServlet("/FilesServlet")
@MultipartConfig
public class FilesServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8"); //请求的编码
response.setCharacterEncoding("utf-8"); //响应的编码
response.setContentType("text/html;utf-8"); //数据显示时的编码 //得到上传文件的目录,将上传文件保存于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
String realPath= this.getServletContext().getRealPath("/upload");
System.out.println("文件存放的位置:"+realPath);
//设置临时目录,上传文件大于缓冲区则先放于临时目录中
String tempPath="E:\\tempPath";
System.out.println("临时文件的存放位置:"+tempPath); //判断存放上传文件的目录是否存在(不存在创建)
File file=new File(realPath);
if(!file.exists()) {
System.out.println("目录不存在!创建目标目录");
file.mkdir();
} //判断临时目录是否存在(不存在则创建)
File file2=new File(tempPath);
if(!file2.exists()) {
System.out.println("临时文件目录不存在!创建临时文件目录");
file2.mkdir();
} /**
* 使用Apache文件上传组件处理文件上传步骤
*
*/
//1.设置环境:创建一个
DiskFileItemFactory factory=new DiskFileItemFactory(); //设置上传文件的临时目录
factory.setRepository(file2); //2.操作核心类
ServletFileUpload upload=new ServletFileUpload(factory); //解决上传编码的问题
upload.setHeaderEncoding("utf-8"); //3.判断enctype:判断提交上来的数据是否是表单提交上传表单的数据
if(!upload.isMultipartContent(request)) {
System.out.println("不是文件,终止");
//按照传统方式获取数据
return;
} //==获取输入像===
//限制单个上传文件的大小(5M)
upload.setFileSizeMax(1024*1024*4);
//限制总上传文件大小(10M)
upload.setSizeMax(1024*1024*6); //4.使用ServletFileUpload解析器上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
try {
List<FileItem> parseParameter = upload.parseRequest(request);
for (FileItem fileItem : parseParameter) {
//如果fileItem中封装的是普通输入项的数据(输出名,值)
if(fileItem.isFormField()) {
String common=fileItem.getFieldName();
String commonValue=fileItem.getString("utf-8");
System.out.println("普通属性:"+common+": "+commonValue);
}else {
//如果fileItem中封装的是上传文件,得到上传的文件名称
String FileName=fileItem.getName();
//多个文件上传有输入框有空的异常处理
if (FileName==null ||FileName.trim().equals("")) {
continue; //为空则退出那一次循环, 第一个没输入则跳过可以继续输入第二个
} //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//处理上传文件的文件名的路径,截取字符串只保留文件名部分。//截取留最后一个"\"之后,+1截取向右移一位("\a.txt"-->"a.txt")
FileName=FileName.substring(FileName.lastIndexOf("\\")+1);
//拼上上传路径。存放路径+上传的文件
String filePath =realPath+"\\"+FileName; //构造输入输出流
InputStream inputStream=fileItem.getInputStream(); //获取fileItem的上传文件的输入流
OutputStream outputStream=new FileOutputStream(filePath); //创建一个文件输入流 //创建一个缓冲区
byte[] b=new byte[1024];
//判断输入流中的数据是否已经读完标识
int len=-1;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))!=-1就表示in里面还有数据
while((len=inputStream.read(b))!=-1) { //没数据则返回-1
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\\"+filename)当中
outputStream.write(b,0,len);
} //关闭流
inputStream.close();
outputStream.close();
//删除临时文件
Thread.sleep(3000);
fileItem.delete(); //删除处理文件上传时生成的临时文件
System.out.println("文件上传成功!!");
} }
} catch (FileUploadException | InterruptedException e) {e.printStackTrace();} } }
需要注意的是:注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
jsp 文件上传操作的更多相关文章
- jsp文件上传
整理了一下jsp的上传下载,由客户端到服务端,包括一些常规的业务 一客户端 先看最基本的情况 1 在表单设置multipart/form-data,通过提交键把数据和附件一次性提交的.服务器更多的是对 ...
- 不用外部JAR包,自己实现JSP文件上传!
看书上(JSP应用与开发技术)使用JSP文件上传,写了个真无语,压根就有很多问题,上传500KB的文件传过去后只剩350KB,而且编码必须是GBK.GB2312,否则传过去的文件都数据截取不正确. 琢 ...
- JSP 文件上传下载系列之二[Commons fileUpload]
前言 关于JSP 文件上传的基础和原理在系列一中有介绍到. 这里介绍一个很流行的组件commons fileupload,用来加速文件上传的开发. 官方的介绍是: 让添加强壮,高性能的文件到你的se ...
- python-web自动化-文件上传操作(非input标签的上传,需要借助第三方工具)
文件上传操作 一.文件上传分两种情况:1. 如果是input可以直接输入路径的,可以直接调send_keys输入路径 2. 非input标签的上传,需要借助第三方工具: 2.1 Autolt 需 ...
- JSP 文件上传
JSP 文件上传 JSP可以通过HTML的form表单上传文件到服务器. 文件类型可以是文本文件.二进制文件.图像文件等其他任何文档. 创建文件上传表单 接下来我们使用HTML标签来创建文件上传表单, ...
- JSP-Runoob:JSP 文件上传
ylbtech-JSP-Runoob:JSP 文件上传 1.返回顶部 1. JSP 文件上传 JSP 可以与 HTML form 标签一起使用,来允许用户上传文件到服务器.上传的文件可以是文本文件或图 ...
- ui自动化chrome文件上传操作
web自动化,再chrome浏览器中文件上传操作
- JSP文件上传--FileUpload组件
如果使用上传操作,并且没有使用框架之类,最好使用Smartupload,因为FileUpdate太难使用. 下载组件: fileupload包:http://commons.apache.org/pr ...
- JSP文件上传--Smartupload组件
把smartupload.jar copy到D:\apache-tomcat-7.0.57\lib下. 创建htm上传文件:smartupload_demo01.htm 由于是上传文件,需要对表单进行 ...
随机推荐
- BEC listen and translation exercise 39
What about jigsaw puzzle design for visually handicapped?给视觉障碍人士设计拼图怎么样? Length is 50cm, and then th ...
- bzoj-2458 2458: [BeiJing2011]最小三角形(计算几何+分治)
题目链接: 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1101 Solved: 380 Des ...
- poj2661 Factstone Benchmark(大数不等式同取对数)
这道题列出不等式后明显是会溢出的大数,但是没有必要写高精度,直接两边取对数(这是很简明实用的处理技巧)得: log2(n!)=log2(n)+log2(n-1)+...+log2(1)<=log ...
- 微信菜单加emoji图标
1.https://icomoon.io/app/#/select----------------选择图标后进入 2. 笑脸表情可选择更多图标,左侧e901,是“字体码” 3.将图片复制件自定义菜单编 ...
- Agc003_D AntiCube
传送门 题目大意 给定$N$个数,求一个最大的子集,使得任意两两的乘积不是一个完全立方数. $n\leq 10^5 A_i\leq 10^{10}$ 题解 考虑两两乘积为$x^3$,由于$x^3\le ...
- 2017-2018-1 20179215《Linux内核原理与分析》第九周作业
实验:理解进程调度时机跟踪分析进程调度与进程切换的过程 一.实验要求 (1)理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判 ...
- 使用 Anthem.NET 框架的一个调试经历
简介:Anthem 是一个很好用的 Ajax 框架,支持 ASP.NET 1.1, 2.0.由于该框架的所有控件都继承自 ASP.NET 自身的服务器控件,保留了几乎所有这些控件的属性和行为(除了把它 ...
- Python 写文件时的Unicode设置
今天在把Evenote的笔记内容写为文件时出错: f.write(content) UnicodeEncodeError: 'gbk' codec can& ...
- DevExpress源码编译总结
独家提供完整可编译sln文件,本篇文章内容包括基础知识(GAC.程序集强签名.友元程序集).编译过程.注册GAC.添加工具箱.多语言支持.运行时和设计时调试 源码地址 链接:http://pan.b ...
- Ruby模块(module)
Ruby模块(module) 2013-04-03 16:47:09| 分类: Ruby | 标签:ruby require load extend include |字号 订阅 ...