在使用servlet上传普通控件时 ,是否指定enctype都无所谓 ,但是当上传文件时,情况就不一样了
实现思路
①在上传时 ,我们必须在form表单上指定enctype为multipart /form-data
②同时需要重写doPost();
[因为前端传的是文件,所以我们不能getParameter()
]
③创建一个磁盘文件项工厂DiskFileItemFactory类
的对象factory
和服务文件上传ServletFileUpload load = new ServletFileUpload(factory)
(以factory为参数)
④再创建一个文件迭代器去获取每一个文件 :
FileItemIterator iter = upload.getItemIterator(request)
⑤设置一个while循环迭代文件 ,同时将文件流变成输出流
FileItemStream stream = iter.next();
InputStream input = stream.openStream();
⑥进行一次判断 ,判断传来的表单里是否包含普通控件 ,有普通控件的 ,看⑧,只有< input type=“file”>的 ,看⑨
-
⑧ 1.先将字节流转换为字符流 ,使用
InputStreamReader
类
2.定义一个带缓冲区的流对象BufferedReader bf = new BufferedReader(reader);
3.使用readLine()
方法, 一次读一行.
4.使用stream.getFieldName()
方法 ,根据name值去区分数据 -
⑨在我们把文件上传以后 ,有两种存储方式 ,一是存在服务器的硬盘 , 并且会对应上路径 / 图片名**(往往头像是按这种存储方式)**,
二是存在服务器的数据库中 ,在查询的时候性能较差
操作流程 : 1.先使用request对象的getRealPath()
方法获取存储路径
2.再使用stream对象的getName()
方法获取上传文件名
3.将两者和后缀拼接在一起 ,生成一个新的文件名
4.定义一个输出流,将生成的名字作为文件名OutputStream out = new FileOutputStream (path+ timestamp + suffix);
5.设置缓冲区 ,将输入和输出流对接上 ,传完以后关闭文件
代码
好气啊method拼错了传了一天没传上去,下面的是正确代码
//servlet
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.tomcat.util.http.fileupload.FileItemIterator;
import org.apache.tomcat.util.http.fileupload.FileItemStream;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class DealServlet
*/
public class DealServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DealServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
//创建磁盘文件工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建服务文件上传对象
ServletFileUpload upload = new ServletFileUpload(factory);
//创建一个文件迭代器
try {
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
// System.out.println("开始处理文件上传");
//创建一个文件迭代流接受迭代器返回的文件对象
FileItemStream stream = iter.next();
//再把文件迭代流变成输入流(使用openStream()方法)
InputStream input = stream.openStream();
//判断是否为 普通控件
if (stream.isFormField()) {
//是普通控件
// System.out.println("含普通控件");
//使用特殊方式去处理 普通控件
//InputStreamReader 用于把字节流转成字符流
InputStreamReader reader = new InputStreamReader(input,"UTF-8");
//input 是字节流 转成字符流 就能够获取到字符
BufferedReader bf = new BufferedReader(reader);
//读取一行 的字符
String name = bf.readLine();
//stream.getFieldName() 取到name ,, 根据name去分辨
System.out.println(stream.getFieldName()+name);
input.close();
} else {
//是文件控件<type ="file">
//获取实际发布路径
String path = request.getRealPath("/");;
System.out.println(path);//输出发布路径查看是否成功上传
//重新定义文件名字
String oldName = stream.getName();//取出文件名
System.out.println(oldName);
long timestamp = System.currentTimeMillis();
// String oldName = stream.getName();
// String mainPart = timestamp;// 用UUID取到一个唯一的值
String suffix = oldName.substring(oldName.lastIndexOf('.'));
// String newName = path+mainPart+suffix;
// System.out.println(newName);
//存在服务器硬盘上
OutputStream out =new FileOutputStream(path+timestamp+suffix);
byte[] buf = new byte[1024];//设置缓冲区
int length =0;
while((length =input.read(buf))!=-1) {
out.write(buf,0,length);
}
input.close();
out.close();
//将图片名字写入数据库
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action ="DealServlet" method ="post" enctype ="multipart/form-data">
用户名<input type ="text" name ="name">
真实姓名<input type ="text" name ="realName">
<input type ="file" name="myFile"/>
<input type="submit" value ="上传文件">
</form>
</body>
</html>