什么是文件上传?为什么使用文件上传?

就是将客户端资源,通过网络传递到服务器端。

就是因为数据比较大,我们必须通过文件上传才可以完成将数据保存到服务器端操作.

文件上传的本质:就是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的类文件.下面是目录结构.

java后台文件上传服务器 java向服务器上传文件_文件上传

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>

然后服务器里面的代码如下.

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);
	}
}

然后再桌面新建一个a.txt的文件,里面写入的数据 : 0123456789

java后台文件上传服务器 java向服务器上传文件_文件上传_02

点击上传.

java后台文件上传服务器 java向服务器上传文件_原创_03

控制台就会输出,但是抓包工具只会获得文件的路径,并不会得到文件内容.

java后台文件上传服务器 java向服务器上传文件_原创_04

如下我们现在修改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的文本内容.

java后台文件上传服务器 java向服务器上传文件_java_05

下面将修改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);
	}
}

然后再上传一次.

java后台文件上传服务器 java向服务器上传文件_原创_03

控制台打印输出得到.

java后台文件上传服务器 java向服务器上传文件_java_07

忘了写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>