
用到两个jar包
第一个相信大家都明白,在用到Servlet写后端的时候都会需要。
第二个则类似于与IO相关的工具类。
这里仅仅为了实现功能,以最基础的表单为例:
提交界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Files Download
提交成功页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
下载
文件上传
文件上传指的是客户端向服务器上传文件,即将保存在客户端的文件上传至服务器中的一个副本,保存到服务器中。
@WebServlet(urlPatterns = "/uploadtest")
public class UpLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
//1、创建上传文件对象
SmartUpload smartUpload = new SmartUpload();
//2、初始化上传操作
PageContext pageContext = JspFactory.getDefaultFactory()
.getPageContext(this,req,resp,null,false,1024,true);
smartUpload.initialize(pageContext);
//2.1、设置编码
smartUpload.setCharset("utf-8");
//3、上传
smartUpload.upload();
//4、获取文件信息
File file =smartUpload.getFiles().getFile(0);
String fileName=file.getFileName();
String contentType=file.getContentType();
//4.1、获取文本信息
String text=smartUpload.getRequest().getParameter("input");
System.out.println(text);
//5、指定上传的路径
String uploadPath = "/uploadfiles/"+fileName;
//6、保存到指定位置
file.saveAs(uploadPath,File.SAVEAS_VIRTUAL);
//7、跳转到成功页面
req.setAttribute("filename",fileName);
req.getRequestDispatcher("success.jsp").forward(req,resp);
} catch (SmartUploadException e) {
e.printStackTrace();
}
}
}
文件下载
文件下载指的是客户端从服务器下载文件,即将原来保存在服务器中的文件下载到客户端中一个副本保存。
@WebServlet(urlPatterns = "/downimg")
public class DownLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String filename=req.getParameter("filename");
String path="/uploadfiles/"+filename;
//设置响应头信息和头类型
resp.setContentType("application/octet-stream");
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename,"utf-8"));
//跳转页面
req.getRequestDispatcher(path).forward(req,resp);
//清空缓冲区
resp.flushBuffer();
}
}
补充
整体结构
获取文字
此时如果表单中有其他数据时,不能通过request直接获取,需要通过SmartUpload对象获取
String name=su.getRequest().getParameter("bookName");
并且该代码要在SmartUpload操作完成后添加
解决乱码new String(name.getBytes("GBK"),"utf-8")
getPageContext
PageContext pageContext = JspFactory.getDefaultFactory()
.getPageContext(Servlet servlet,
ServletRequest request,
ServletResponse response,
String errorPageURL,
boolean needsSession,
int buffer,
boolean autoflush);
| 参数 | 含义 |
|---|---|
| servlet | 请求的servlet,在servlet中传this即可 |
| request | servlet上挂起的当前请求 |
| response | servlet上挂起的当前响应 |
| errorPageURL | 请求JSP的错误页面的URL,或null |
| needsSSession | 是否需要session |
| buffer | 以字节为单位的缓冲区大小 |
| autoflush | 缓冲区应该在缓冲区溢出时自动刷新到输出流,还是抛出IOException |
| 属性名称 | 说明 |
|---|---|
| public final void initialize(PageContext pageContext) | 执行上传和下载的初始化工作,必须实现 |
| public void upload() | 实现文件数据的上传,在 initialize方法后执行 |
| public int save(String pathName) | 将全部上传文件保存到指定的目录下,并返回保存的文件个数 |
| public void setAllowFilesList(String ExtList) | 指定允许上传的文件扩展名,接受一个扩展名列表,以逗号分割 |
| public void setDeniedFilesList(String fileList) | 指定了禁止上传的文件拓展名列表,每个拓展名之间以逗号分割 |
| public void setMaxFileSize(long filesize) | 设定每个文件允许上传的最大长度 |
| public void setTotalMaxFileSize(long totalfilesize) | 设定允许上传文件的总长度 |