文件上传
实现web开发中的文件上传功能,操作步骤:
1.在web页面中添加上传输入项。
2.在servlet中读取上传文件的数据,并保存到本地硬盘中。
<input type=“file”>标签用于在web页面中添加文件上传输入项,设置文件上传输入项时
须注意:
附加知识:1.必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。2.必须把form的enctype属值设为“ multipart/form-data ”2.必须把form的method属性设置为post方式。
enctype属性规定在发送表单数据之前如何对其进行编码。属性可能的值:
application/x-www-form-urlencoded 在发送前编码所有字符(默认)。multipart/form-data 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。text/plain 空格转换为 "+" 加号,但不对特殊字符编码。
方式1:手动实现文件上传
案例中上传的文件a.txt
web页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>手动执行文件上传</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="${pageContext.request.contextPath }/TestServlet" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="userName"/><hr/>
文件:<input type="file" name="file1"/> <input type="submit" value="提交"/>
</form>
</body>
</html>
Servlet手动获取上传文件
package com.cn.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 手动获取文件上传
* @author liuzhiyong
*
*/
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取表单(POST)提交的数据流
ServletInputStream in = request.getInputStream();
//转换流
InputStreamReader inStream = new InputStreamReader(in);
//缓冲流
BufferedReader reader = new BufferedReader(inStream);
//输出数据
String str = null;
while((str=reader.readLine()) != null){
System.out.println(str);
}
//关闭
reader.close();
inStream.close();
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
效果:
由于手动上传文件,需要另外去解析,所以使用现成的工具,详见方式2.
方式2:文件上传组件(FileUpload组件,推荐)
文件上传功能开发中很常用,Apache组织也提供了文件上传组件,FileUpload组件。
FileUpload组件使用步骤:
下载组件,引入jar文件
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
共2个jar包,
点击打开链接,即可使用其API了。
FileUpload组件API:
|-Interface FileItemFactory 文件上传工厂类(把每一个请求表单项封装为一个个FileItem对象)
|--Class DiskFileItemFactory
|----void setRepository(java.io.File repository) 设置临时缓存目录
|-Class ServletFileUpload 文件上传核心类对象,可以获取所有的FileItem对象
|----List parseRequest(javax.servlet.http.HttpServletRequest request) 获取所有文件上传项FileItem
|----boolean isMultipartContent(javax.servlet.http.HttpServletRequest request)
判断上传表单是否为multipart/form-data类型(即
判断当前表单是否为文件上传表单
),如果是返回true
|----void setFileSizeMax(long fileSizeMax) 设置单个文件上传最大值
|----void setSizeMax(long sizeMax) 设置总的文件最大大小
|----void setHeaderEncoding(java.lang.String encoding) 设置上传的文件名的编码,相当于request.setCharacterEncoding(encoding)
|-Interface FileItem 封装了普通表单项数据以及文件上传表单数据
|----String getFieldName() 获取上传表单元素名称
|----String getString() 获取上传元素值
|----String getString(java.lang.String encoding) 获取上传元素值,并处理格式
|----String getContentType() 获取上传文件类型【仅上传文件表单项有数据】
|----InputStream getInputStream() 获取post方式提交上来的上传文件流【仅文件上传表单项有数据】
|----String getName() 获取上传文件名
|----void write(java.io.File file) 写文件到指定文件
|----void delete() 删除临时文件
使用FileUpload组件测试:
web页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>手动执行文件上传</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="${pageContext.request.contextPath }/FileUpLoadServlet" method=