先把 新鲜出炉、香饽饽的代码 为您奉上! 萌萌哒
软件: Eclipse、tomcat
技术: JSP、Servlet
插件下载: commons-fileupload
commons-io
demo规划
DownloadServlet
package com.bjpowernode.servlet;
import java.io.*;
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 org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String fileName = request.getParameter("name");
String fileNameCopy = fileName;
// 打散:按当前字符编码进行打散
byte[] bytes = fileName.getBytes("UTF-8");
// 组装:按目标字符编码进行组装
fileName = new String(bytes, "ISO8859-1");
// 修改响应的头部属性 content-disposition 值为 attachment
response.setHeader("content-disposition", "attachment;filename=" + fileName);
// 获取连接服务器资源文件的输入流
InputStream is = this.getServletContext().getResourceAsStream("/resource/" + fileNameCopy);
// 获取输出流
ServletOutputStream os = response.getOutputStream();
// 将输入流中的数据写入输出流
int len = -1;
byte[] buf = new byte[1024];
while((len = is.read(buf)) != -1) {
os.write(buf, 0, len);
}
// 关闭流
os.close();
is.close();
}
}
RegisterServlet
package com.bjpowernode.servlet;
import java.io.*;
import java.util.*;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
/**
* Servlet implementation class RegisterServlet
*/
@WebServlet("/RegisterServlet")
public class RegisterServlet extends HttpServlet {
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.判断请求是否为 mutilpart 请求
if(!ServletFileUpload.isMultipartContent(request)) {
throw new RuntimeException("当前请求不支持文件上传!");
}
DiskFileItemFactory factory = new DiskFileItemFactory(); // 2.创建一个 fileItem 工厂
/**
* 扩展一:设置文件上传大小
*
*/
// 设置使用临时文件的边界值,大于该值,上传文件会先保存在临时文件中,否则,上传文件将直接携入到内存中
// 单位:字节。设置边界值为 1 M
factory.setSizeThreshold(1024 * 1024 * 1);
// 设置临时文件
String tempPath = this.getServletContext().getRealPath("/temp");
File temp = new File(tempPath);
factory.setRepository(temp);
/**
* 扩展一结束
*/
ServletFileUpload upload = new ServletFileUpload(factory); // 3.创建文件上传核心组件
/**
* 扩展二:解决乱码问题
* 2.解决上传文件名的乱码问题
*/
// 设置响应 item 的头部字符编码,解决文件乱码问题
upload.setHeaderEncoding("UTF-8");
/**
* 扩展二 --2:结束
*/
try {
List<FileItem> items = upload.parseRequest(request); // 解析请求
// 遍历 items
for(FileItem item : items) {
// item 为普通表单项
if(item.isFormField()) {
String fieldName = item.getFieldName(); // 获取表单项的名称
/* 原版本
String fieldValue = item.getString(); // 获取表单项的值
*/
/**
* 扩展二:解决中文乱码问题
* 1.普通表单乱码问题
*/
String fieldValue = item.getString("UTF-8"); // 获取表单项的值
/**
* 扩展二:结束
*/
System.out.println(fieldName + " = " + fieldValue);
}
// item 为文件表单项
else {
String fileName = item.getName(); // 获取上传文件的原始名称
/**
* 扩展三:解决上传同名文件覆盖问题
*/
fileName = System.currentTimeMillis() + fileName;
/**
* 扩展三:结束
*/
InputStream is = item.getInputStream(); // 获取包含文件上传内容的输入流
String path = this.getServletContext().getRealPath("/images"); // 获取文件保存在服务器中的路径
File descFile = new File(path, fileName); // 创建目标文件,用于保存上传文件
OutputStream os = new FileOutputStream(descFile); // 创建文件输出流
// 输入流中数据写入到输出流
int len = -1;
byte[] buf = new byte[1024];
while((len = is.read(buf)) != -1) {
os.write(buf, 0, len);
}
// 关闭流
os.close();
is.close();
/**
* 扩展一:将临时储存的文件转存
*/
item.delete();
/**
* 扩展一:结束
*/
}
}
request.getRequestDispatcher("index.jsp").forward(request, response);
}
catch (org.apache.commons.fileupload.FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 扩展四:限制文件的上传大小
* 扩展五:实现上传文件不同文件夹的转存
*
* 以上两个扩展在此省略
*/
download1.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>
<!-- 超链接实现下载 -->
<a href="${pageContext.request.contextPath }/resource/1.txt">1.txt</a><br>
<a href="${pageContext.request.contextPath }/resource/beauty1.JPG">beauty1.JPG</a><br>
<a href="${pageContext.request.contextPath }/resource/Diana Boncheva - Purple Passion.mp3">Diana Boncheva - Purple Passion.mp3</a><br>
<a href="${pageContext.request.contextPath }/resource/Ethno Music Project - Childhood Memory.mp3">Ethno Music Project - Childhood Memory.mp3</a><br>
<a href="${pageContext.request.contextPath }/resource/night.gif">night.gif</a><br>
<a href="${pageContext.request.contextPath }/resource/Omar Akram - Take My Hand.mp3">Omar Akram - Take My Hand.mp3</a><br>
<a href="${pageContext.request.contextPath }/resource/Richard Clayderman - 梦中的婚礼.mp3">Richard Clayderman - 梦中的婚礼.mp3</a><br>
</body>
</html>
download2.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>
<a href="${pageContext.request.contextPath }/DownloadServlet">下载</a><br>
</body>
</html>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HHHH</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/RegisterServlet" method="post" enctype="multipart/form-data">
<table width="200px">
<tr>
<th colign="center">姓名</th>
<th><input type="text" name="name"/></th>
</tr>
<tr>
<th colign="center">年龄</th>
<th><input type="text" name="age"/></th>
</tr>
<tr>
<th colign="center">文件</th>
<th><input type="file" name="file"/></th>
</tr>
<tr>
<th colspan="2"><button type="button">上传</button></th>
</tr>
</table>
</form>
</body>
</html>
PS:为了让 demo 运行起来,你只需要按 图 将创建文件夹即可,之后 happlily copy cade 之后就完事了。
项目具体介绍请 转至
项目打包下载: