天天看点

【文件上传和下载-----JavaWeb实验四】

题目描述

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

运行截图

基于个人隐私,部分输入已打码!

【文件上传和下载-----JavaWeb实验四】
【文件上传和下载-----JavaWeb实验四】
【文件上传和下载-----JavaWeb实验四】

实验总结

(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”。