实验目的
1)了解文件上传和下载的技术原理。
2)加深对会话的理解。
3)掌握servlet程序开发和调试的方法,增强上机动手的能力。
实验内容
在线教学网站系统增加文件上传和下载模块,实现如下功能:
1)实现在客户端将文件上传到服务器固定目录下。
2)实现在客户端从服务器固定目录下载文件。
3)当用户再次进入考试页面,可以显示上次考试的分数。(选择会话或数据库完成)
说明:文件的上传和下载目录由自己设定。
FileUpload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>我的文件上传操作</title>
</head>
<body>
${message}<br>
<form action="fileUpload.do" enctype="multipart/form-data" method="post">
<table>
<tr><td colspan="2" align="center">文件上传</td></tr>
<tr><td>会员号:</td>
<td><input type="text" name="M_number" size="30"/></td>
</tr>
<tr><td>文件名:</td>
<td><input type="file" name="fileName" size="30" /></td>
</tr>
<tr>
<td align="right"><input type="submit" value="提交"></td>
<td align="left"><input type="reset" value="重置"/> </td>
</tr>
</table>
<a href="login.jsp">返回登陆页面</a>
<a href="text.jsp">返回考试页面</a>
</form>
<a href="download" >下载文件</a>
<a href="score">查看上一次成绩</a>
</body>
</html>
FileUploadServlet
package demo;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet(name = "FileUploadServlet",urlPatterns = {"/fileUpload.do"})
@MultipartConfig(location = "D:\\",fileSizeThreshold = 10240)
public class FileUploadServlet extends HttpServlet{
public String getFilename(Part part)
{
String fname=null;
//返回上传问的文件部分的content-disposition请求头的值
String header=part.getHeader("content-disposition");
System.out.println(header);
fname=header.substring(header.lastIndexOf("=")+2,header.length()-1);
return fname;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String path=this.getServletContext().getRealPath("/");
String M_number=req.getParameter("M_number");
Part p= req.getPart("fileName");
String message="";
if(p.getSize()>10240*10240)
{
//上传的文件不超过10MB
p.delete();
message="文件太大,不能上传";
}
else {
//文件存储在文档根目录下member子目录种会员子目录中
path=path+"\\member\\"+M_number;
File f=new File(path);
if(!f.exists())
{
f.mkdirs();
}
String fname=getFilename(p);
p.write(path+"\\"+fname);
message="文件上传成功";
}
req.setAttribute("message",message);
RequestDispatcher rd=req.getRequestDispatcher("/fileUpload.jsp");
System.out.println(path);
rd.forward(req,resp);
}
}
注意的点
form标签中应该指定enctype属性,它的值应该为”multipart/form-data,form的method属性应该为post
FileDownLoad.java
package demo;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
@WebServlet(urlPatterns = {"/download"})
public class FileDownLoadServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session=req.getSession();
String dataDiretory=req.getServletContext().getRealPath("/WEB-INF/data");
System.out.println(dataDiretory+"差不多得了");
File file=new File(dataDiretory,"A.pdf");//Java.pdf要修改
if(file.exists())
{
resp.setContentType("application/octet-stream");
resp.addHeader("Content-Disposition","attachment;filename=A.pdf");
byte []buffer=new byte[10240*10240];
FileInputStream fis=null;
BufferedInputStream bis=null;
try {
fis=new FileInputStream(file);
bis=new BufferedInputStream(fis);
OutputStream os=resp.getOutputStream();
int i=bis.read(buffer);
while (i!=1)
{
os.write(buffer,0,i);
i=bis.read(buffer);
}
}
catch (IOException ex)
{
System.out.println(ex.toString());
}
finally {
if(bis!=null)
{
bis.close();
}
if(fis!=null)
{
fis.close();
}
}
}
else {
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
out.println("文件不存在");
}
}
}
首先要把对应的文件放在指定的文件夹下
Score.java
package demo;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
@WebServlet(urlPatterns = {"/score"})
public class score extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session= req.getSession();//获取会话
int score=(int)session.getAttribute("score");//获取分数的值
PrintWriter out= resp.getWriter();
out.println("<html><body>");
out.println("last score:"+score);
out.println("</body></html>");
}
}