第一部分
单文件上传
单个文件上传时,在Servlet中可以通过HttpServletRequest对象request调用方法getPart(String name)获得Part文件对象。
编写一个uploadHttpOne.jsp
uploadHttpOne.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="UTF-8">
<title>HttpServlet对文件上传的支持</title>
</head>
<body>
<form action ="http://localhost:8080/demo/servlet/upload" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>文件描述:</td>
<td><input type="text" name="filediscription"></td>
</tr>
<tr>
<td>请选择文件:</td>
<td><input type="file" name="resPath"></td>
</tr>
<tr>
<td align="right"><input type="reset" value="重填"></td>
<td><input type="submit" value="上传"></td>
</tr>
</table>
</form>
</body>
</html>
编写一个UploadHttpOneServlet.java
UploadHttpOneServlet.java
package servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
@MultipartConfig(maxFileSize = 10*1024*1024)
public class UploadHttpOneServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("utf-8");
Part part = request.getPart("resPath");
String filediscription = request.getParameter("filediscription");
out.println("输入的文件描述:"+filediscription+"<br>");
File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
if (!uploadFileDir.exists()){
uploadFileDir.mkdir();
}
String oldName = MyUtil.getFileName(part);
out.println("上传文件的原始名:"+oldName+"<br>");
out.println("上传文件的大小:"+part.getSize()+"<br>");
if (oldName!=null){
part.write(uploadFileDir+File.separator+oldName);
}
out.println("文件上传到:"+uploadFileDir+File.separator+oldName+"<br>");
}
}
Servlet规范中不提供获取上传文件文件名的方法,但是可以通过Part对象调用GetHeader("content-disposition")方法获取。我们可以讲getFileName(Part part)方法写到一个工具类MyUtil中,方便调用。
MyUtil.java
package servlet;
import javax.servlet.http.Part;
public class MyUtil {
public static String getFileName(Part part){
if(part==null)
return null;
String fileName = part.getHeader("content-disposition");
if(fileName.lastIndexOf("=") + 2 == fileName.length() - 1)
return null;
return fileName.substring(fileName.lastIndexOf("=") + 2,fileName.length() - 1);
}
}
xml的配置
<servlet>
<servlet-name>UploadHttpOneServlet</servlet-name>
<servlet-class>servlet.UploadHttpOneServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadHttpOneServlet</servlet-name>
<url-pattern>/servlet/upload</url-pattern>
</servlet-mapping>
实验运行结果
第二部分
多文件的上传
多文件上传时,在Servlet中可以通过HttpServletRequest对象request调用方法getParts()获得Part文件对象集合。
unloadHttpMulti.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<meta charset="utf-8">
<title>对文件上传的支持</title>
</head>
<body>
<form action ="http://localhost:8080/demo/servlet/uhm" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>文件1描述:</td>
<td><input type="text" name="filediscription1"></td>
</tr>
<tr>
<td>请选择文件1:</td>
<td><input type="file" name="resPath1"></td>
</tr>
<tr>
<td>文件2描述:</td>
<td><input type="text" name="filediscription2"></td>
</tr>
<tr>
<td>请选择文件2:</td>
<td><input type="file" name="resPath2"></td>
</tr>
<tr>
<td align="right"><input type="reset" value="重填"></td>
<td><input type="submit" value="上传"></td>
</tr>
</table>
</form>
</body>
</html>
UploadHttpMultiServlet.java
package servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
@MultipartConfig(maxFileSize = 10*1024*1024)
public class UploadHttpMultiServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("utf-8");
String filediscription1 = request.getParameter("filediscription1");
out.println("输入的文件1描述:"+filediscription1+"<br>");
String filediscription2 = request.getParameter("filediscription2");
out.println("输入的文件2描述:"+filediscription2+"<br>");
File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
if (!uploadFileDir.exists()){
uploadFileDir.mkdir();
}
Collection<Part>parts = request.getParts();
for(Part part:parts){
if(part == null || !part.getName().contains("resPat")){
continue;
}
String oldName = MyUtil.getFileName(part);
out.println("上传文件的原始名:"+oldName+"<br>");
out.println("上传文件的大小:"+part.getSize()+"<br>");
if (oldName!=null){
part.write(uploadFileDir+File.separator+oldName);
}
out.println("文件上传到:"+uploadFileDir+File.separator+oldName+"<br>");
}
}
}
xml的配置
<servlet>
<servlet-name>UploadHttpMultiServlet</servlet-name>
<servlet-class>servlet.UploadHttpMultiServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadHttpMultiServlet</servlet-name>
<url-pattern>/servlet/uhm</url-pattern>
</servlet-mapping>
运行结果
上传文件的限定
@MultipartConfig(maxFileSize = 10*1024*1024)
通过加入注解可以设置上传文件的最大值
当超过文件大小的最大值时,会出现以下页面
第三部分
文件下载
实验运行前的准备:导入相关的jar包
1.下载网址:http://tomcat.apache.org/taglibs/standard/
2. 点击download
3.下载 taglibs-standard-impl-1.2.5.jar 和 taglibs-standard-spec-1.2.5.jar
ShowlDownServlet.java
package servlet;
import javax.servlet.RequestDispatcher;
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 java.io.File;
import java.io.IOException;
@WebServlet("/showDownServlet")
public class ShowDownServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
File downLoadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
File[] list = downLoadFileDir.listFiles();
request.setAttribute("fileList", list);
RequestDispatcher dis = request.getRequestDispatcher("showInfo.jsp");
dis.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
showInfo.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri ="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta charset="utf-8">
<title>显示下载文件</title>
</head>
<body>
<form action="http://localhost:8080/demo/servlet/uhm" method="post" enctype="multipart/form-data">
<table border="1">
<tr bgcolor="#90ee90">
<th>文件名称</th>
<th>下载课件</th>
</tr>
<c:forEach var="afile" items="${fileList}">
<tr>
<td>${afile.name}</td>
<td align="center"><a href="downloadServlet?resPath=${afile.name}"
style="text-decoration: none">下载</a></td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
DownloadServlet.java
package servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1l;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
File downLoadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
String aFileName =null;
FileInputStream in = null;
ServletOutputStream out = null;
try{
aFileName = request.getParameter("resPath");
response.setHeader("Content-Type","application/x-msdownload");
response.setHeader("Content-Disposition","attachment;filename="+MyUtil.toUTF8String(aFileName));
in =new FileInputStream(downLoadFileDir+ File.separator+aFileName);
out =response.getOutputStream();
out.flush();
int aRead =0;
byte b[] =new byte[1024];
while((aRead=in.read(b))!= -1&in != null){
out.write(b,0,aRead);
}
out.flush();
in.close();
out.close();
}catch (Throwable e){
e.printStackTrace();
}
}
}
解决文件名乱码问题,在工具类MyUtil.java类中添加一个静态字符编码转换方法
public static String toUTF8String(String str){
StringBuffer sb =new StringBuffer();
int len = str.length();
for(int i=0;i<len;i++){
char c =str.charAt(i);
if(c>=0&&c<=255){
sb.append(c);
}else{
byte b[];
try{
b= Character.toString(c).getBytes("UTF-8");
}catch (UnsupportedEncodingException e){
e.printStackTrace();
b= null;
}
for(int j=0;j<b.length;j++){
int k= b[j];
if(k<0){
k&=255;
}
sb.append("%"+Integer.toHexString(k).toUpperCase());
}
}
}
return sb.toString();
}
运行结果
通过地址“http://locallhost:80/demo/showDownServlet”运行ShowDownServlet,跳转到showInfo.jsp页面,结果如下
点击下载,下载的文件默认在C盘用户文件中下载文件夹中。