题目描述
1、掌握文件上传、下载的流程
2、熟悉FileItem接口和DiskFileItemFactory、ServletFileUpload类
3、熟悉文件下载中如何设置HTTP协议的响应消息头
4、 掌握文件上传、下载过程中数据流的传递。
实验内容
1) 创建上传页面form.jsp,完成个人信息(姓名 性别 年龄 照片)的信息填写。其中照片要上传一张图片。
2) 新建UserBean,记录姓名,性别,年龄,照片。
3) 创建UploadServlet类,用于获取表单及上传文件的信息,将数据保存在UserBean中,将页面跳转至download.jsp,在download.jsp中提供照片下载的超链接。
4) 编写DownloadServlet类,完成照片下载的功能。
代码
//文件上传的服务器:
//UploadServlet.java
package com.servlet;
import java.io.*;
import java.util.*;
import java.io.IOException;
import javax.management.RuntimeErrorException;
import javax.servlet.ServletException;
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;
/**
* Servlet implementation class fileServlet
*/
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public UploadServlet() {
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 {
try {
//解决乱码问题
response.setContentType("text/html;charset=utf-8");
//创建DiskFileItemFactory工厂对象
DiskFileItemFactory factory=new DiskFileItemFactory();
//设置文件缓存目录,如果该目录不存在则新建一个文件
File f=new File("E:\\TempFolder");
if(!f.exists()) {
f.mkdirs();
}
//设置文件的缓存路径
factory.setRepository(f);
//创建ServletFileUpload对象
ServletFileUpload fileupload=new ServletFileUpload(factory);
//设置字符编码
fileupload.setHeaderEncoding("utf-8");
//解析request,得到上传文件的FileItem对象
List<FileItem> fileitems=fileupload.parseRequest(request);
//获取字符流
PrintWriter writer = response.getWriter();
//遍历集合
for(FileItem fileitem:fileitems) {
//判断是否为普通字段
if(fileitem.isFormField()) {//如果fileitem中封装的是普通输入项的数据
//获得字段名和字段值
String name=fileitem.getFieldName();
if(name.equals("uname")) {
//如果文件不为空,将其保存在value中
if(!fileitem.getString().equals(" ")) {
String value=fileitem.getString("utf-8");
writer.print("姓名:"+value+"<br/>");
}
}
if(name.equals("sex")) {
if(!fileitem.getString().equals(" ")) {
String value=fileitem.getString("utf-8");
writer.print("性别:"+value+"<br/>");
}
}
if(name.equals("age")) {
if(!fileitem.getString().equals(" ")) {
String value=fileitem.getString("utf-8");
writer.print("年龄:"+value+"<br/>");
}
}
}
else {
//获取文件的文件名
String filename=fileitem.getName();
//处理上传文件
if(filename!=null&& !filename.equals(" ")) {
writer.print("图片名称:"+filename+"<br/>");
//截取出文件名
filename=filename.substring(filename.lastIndexOf("."));
//文件名唯一
filename ="_img"+filename;//UUID.randomUUID().toString()+
//在服务器中创建同名文件
String webPath="D:\\javaee1\\test_file\\WebContent\\Upload\\";
//将服务器中文件夹路径与文件名组成完整的服务器路径
String filepath=webPath+filename;
//创建文件
File file = new File(filepath);
file.getParentFile().mkdirs();
file.createNewFile();
//获得上传文件流
InputStream in=fileitem.getInputStream();
//使用FileOutputStream打开服务器的上传文件
FileOutputStream out=new FileOutputStream(file);
//流的对拷
byte[] buffer=new byte[1024];//每次读取1个字节
int len;
//开始读取上传文件的字节,并将其输出到服务端的上传文件输出流中
while((len=in.read(buffer))>0)
out.write(buffer,0,len);
//关闭流
in.close();
out.close();
//删除临时文件
fileitem.delete();
writer.print("图像路径:"+filepath+"<br/>");
writer.print("文件上传成功!<br/>");
}
}
}
} catch (Error e) {
throw new RuntimeErrorException(e);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//登录界面:
//Form.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="UploadServlet" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="uname"><br/>
性别:<input type="text" name="sex"><br/>
年龄:<input type="text" name="age"><br/>
照片:<input type="file" name="img"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
//UserBean.java
package com.bean;
public class UserBean {
private String name;
private String sex;
private String age;
private String img_load;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getImg_load() {
return img_load;
}
public void setImg_load(String img_load) {
this.img_load = img_load;
}
}
运行截图
基于个人隐私,部分输入已打码!
实验总结
(1) 之前学的解决乱码的方法:可以再doGet()中书写:response.setContentType(“text/html;charset=utf-8”);而解决乱码时的新的方式是:fileitem.getString(“utf-8”)。
(2) 除了在之前引入的两个jar包即servlet-api.jar和jsp-api.jar,还要再新引入两个jar包即
commons-fileupload-1.3.1.jar和 commons-io-2.4.jar。可以解析表单域等。
(3) 在上传文件时,method属性需要是post形式,并且Form表单的enctype="multipart/form-data。
(4) 只要自己设置了默认上传的路径,如果该硬盘内没有该路径,那么运行之后也会在该硬盘内生成一个该路径,上边就显示了该图片,当然前提是得有这个硬盘。
(5) 标签在使用时应当注意:必须设置input的name属性,不然浏览器将不会发送上传文件的数据;其二就是method=”post”。