什么是文件上传?为什么使用文件上传?
就是将客户端资源,通过网络传递到服务器端。
就是因为数据比较大,我们必须通过文件上传才可以完成将数据保存到服务器端操作.
文件上传的本质:就是IO流的操作。
演示:文件 上传应该 怎样操作?
浏览器端:
1.method=post 只有post才可以携带大数据
2.必须使用<input type='file' name='f'>要有name属性
3.encType="multipart/form-data"
服务器端:
request对象是用于获取请求信息。
它有一个方法 getInputStream(); 可以获取一个字节输入流,通过这个流,可以读取到
所有的请求正文信息.
文件上传原理:
浏览器端注意上述三件事,在服务器端通过流将数据读取到,在对数据进行解析.
将上传文件内容得到,保存在服务器端,就完成了文件上传。
在实际开发中,不需要我们进行数据解析,完成文件上传。因为我们会使用文件上传的工具,它们已经封装好的,提供API,只要调用它们的API就可以完成文件上传操作.我们使用的commons-fileupload,它是apache提供的一套开源免费的文件上传工具。
实现文件上传:
首先创建一个web Project的项目,为FileUpload的项目,新建一个upload1的jsp页面,和一个Upload1Servlet的类文件.下面是目录结构.
upload1.jsp的页面如下,这里的method="post",因为如果为get的话,只能携带很少的数据,而post是可以携带很多的数据.
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/upload1" method="post">
<input type="text" name="content"><br>
<input type="file" name="f"><br>
<input type="submit" value="上传">
</form>
</body>
</html>
<input type="text" name="content"><br>
<input type="file" name="f"><br>
<input type="submit" value="上传">
</form>
</body>
</html>
然后服务器里面的代码如下.
package cn.itcast.web.servlet;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Upload1Servlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("upload1 servlet");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("upload1 servlet");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
然后再桌面新建一个a.txt的文件,里面写入的数据 : 0123456789
点击上传.
控制台就会输出,但是抓包工具只会获得文件的路径,并不会得到文件内容.
如下我们现在修改upload1.jsp页面的method="post" 后面的内容 enctype="multipart/form-data" , 它会将正文的内容进行分割.
<form action="${pageContext.request.contextPath}/upload1" method="post" encType="multipart/form-data">
<input type="text" name="content"><br>
<input type="file" name="f"><br>
<input type="submit" value="上传">
</form>
然后再在浏览器页面上传一次,抓包得到如下数据,得到a.txt的文本内容.
下面将修改upload1servlet.java文件进修改,未获取正文内容打印到控制台.
package cn.itcast.web.servlet;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Upload1Servlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//通过request获取一个字节输入流,将所有的请求正文信息读取到,打印到控制台.
InputStream is = request.getInputStream();
byte[] b = new byte[1024];
int len = -1;
while((len=is.read(b))!=-1){
System.out.print(new String(b,0,len));
}
is.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
然后再上传一次.
控制台打印输出得到.
忘了写web.xml配置文件了,补上!
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>Upload1Servlet</servlet-name>
<servlet-class>cn.itcast.web.servlet.Upload1Servlet</servlet-class>
</servlet>
<servlet>
<servlet-name>Upload2Servlet</servlet-name>
<servlet-class>cn.itcast.web.servlet.Upload2Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Upload1Servlet</servlet-name>
<url-pattern>/upload1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Upload2Servlet</servlet-name>
<url-pattern>/upload2</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>