1. 原生Servlet实现上传下载
1.1 导入jar包
1.2 请求格式要求
- 设定form表单的method属性值为post
- 设定form表单的enctype属性值为multipart/form-data
1.3 UploadServlet实现
@WebServlet("/upload")
public class UploadServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp){
//解析请求中的二进制数据
//创建FileItemFactory对象
FileItemFactory factory=new DiskFileItemFactory();
//创建解析对象
ServletFileUpload upload=new ServletFileUpload(factory);
//设置上传资源大小限制(以字节为单位)
//单个文件大小
upload.setFileSizeMax(1024*1024);
//请求资源总大小
upload.setSizeMax(1024*1024*10);
//设置请求头字符编码集
upload.setHeaderEncoding("utf-8");
//解析
List<FileItem> items=null;
try{
items=upload.parseRequerst(req);
}catch(FileUploadException e){
e.printStackTrace();
resp.getWriter().write("文件超出大小限制!");
return;
}
//处理请求
//存储上传资源
String oldName="";
String newName="";
String type="";
String desc="";
String suffix="";
String path="";
for(FileItem item:items){
//判断是否为文件对象
if(!item.isFormFiled()){
//获取文件类型
type=item.getContentType();
//获取文件原名
oldName=item.getName();
//获取文件后缀名
suffix=oldName.substring(oldName.lastIndexOf("."));
//校验文件类型
if(!(".png").equals(suffix)){
resp.getWriter().write("文件类型不正确!");
return;
}
//创建文件存储名
newName=""+UUID.randomUUID()+System.currentTimeMillis()+suffix;
//创建文件存储路径
path=this.getServletContext().getRealPath("/uploadfiles");
try{
item.write(new File(path,newName));
}catch(Exception e){
e.printStackTrace();
}
}else{
if("desc".equals(item.getFiledName())){
desc=item.toString("utf-8");
}
}
}
//记录上传文件信息
//获取当前用户ID
int uid=((User)req.getSession().getAttribute("user")).getUid();
Upload u=new Upload(uid,newName,oldName,type,desc);
//业务层处理
UploadService service=new UploadServiceImpl();
int i=service.upload(u);
if(i>0){
resp.getWriter().write("上传成功");
}else{
resp.getWriter().write("上传失败");
}
}
}
1.4 DownloadServlet实现
@WebServlet("/download")
public class DownloadServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp){
//获取请求信息
String filename=req.getParameter("filename");
String filetype=req.getParameter("filetype");
//设定响应文件类型
resp.setContentTpye(filetype);
//设定响应另存为
resp.setHeader("Content-Disposition","attachment;filename="+filename);
//处理请求
//获取下载文件的路径
String path=this.getServletContext().getRealPath("/uploadfile/"+filename);
//获取下载文件的读取流对象
FileInputStream fis=new FileInputStram(path);
//获取输出流对象
ServletOutputStream sos=resp.getOutputStream();
//响应结果
IOUtils.copy(fis,sos);
//关闭流资源
fis.close();
sos.close();
}
}
2. SpringMVC实现上传下载
2.1 导入jar包
包括SSM整合jar包及上传下载的jar包
2.2 请求格式要求
请求格式与原生一致
2.3 SpringMVC配置文件处理上传文件大小
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
//请求数据最大值
<property name="maxInMemorySize" value="10485760"/>
//单个文件最大值
<property name="maxUploadSize" value="1048576"/>
//请求头字符集
<property name="defaultEncoding" value="utf-8"/>
</bean>
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="org.springframework.web.multipart.MaxUploadSizeException">limit.jsp</prop>
</props>
</property>
</bean>
2.4 文件上传的单元方法
@Controller
public class MyController{
@RequestMapping("upload")
public String upload(String uname,MultipartFile file,HttpServletRequest req){
//获取文件原始名
String oldName=file.getOriginalFilename();
//获取文件后缀名
String suffix=oldName.substring(oldName.lastIndexOf("."));
//判断文件类型
if(!(".png".equals(suffix))){
return "redirect:/error.jsp";
}
//创建文件新名
String newName=""+UUID.randomUUID()+System.currentTimeMills()+suffix;
//创建文件存储路径
String path=req.getServletContext().getRealPath("/uploadfiles");
//存储
file.transferTo(new File(path,newName));
return "redirect:/success.jsp";
}
}
2.5 文件下载的单元方法
@Controller
public class MyController{
@RequestMapping("download")
public String download(String newName,String type,HttpServletRequest req,HttpServletResponse resp){
//设定响应类型
resp.setContentType(type);
//设定响应头
resp.setHeader("Content-Disposition","attachment;filename="+newName);
//获取文件下载的路径
String path=req.getServletContext.getRealPath("/uploadfiles/"+newName);
//创建输入流对象
InputStream is=new FileInputStream(new File(path));
//创建输出流对象
ServletOutputStream sos=resp.getOutputStream();
//结果响应
IOUtils.copy(is,sos);
//关闭流资源
is.close();
sos.close();
}
}
3. SpringMVC自定义视图解析器
3.1 作用
简化WEB-INF下资源访问
3.2 实现
- 在SpringMVC的配置文件中配置视图解析器bean,并注入前缀和后缀
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean>
- 在单元方法中直接返回该资源的名字即可(return “/WEB-INF/view.jsp”; —> reutrn “view”;)
- 如果有同名问题,则不能省略forward关键字
//请求转发WEB-INF下view.jsp return "view"; //请求转发web下view.jsp return "forward:/view.jsp"; //请求转发一个别名为view的单元方法 return "forward:view";
- 请求转发WEB-INF下多个资源可只声明一个单元方法,但需要该方法使用restful风格来实现
@RequestMapping("{uri}") public String getJsp(@PathVariable("uri") String uri){ return uri; }
- WEB-INF下的静态资源可配置配置静态资源放行时的location属性值前添加“/WEB-INF”值
<mvc:resources mapping="/js/**" location="/js/"> <mvc:resources mapping="/js/**" location="/WEB-INF/js/"/>
4. SpringMVC拦截器
4.1 作用
根据需求,拦截指定的请求
4.2 实现
- 创建一个实现了拦截器接口的普通类
public class MyInterceptor implements HandlerInterceptor{
@Resource
private MyController myController;
@Override
public boolean preHandle(HttpServletRequest req,HttpServletResponse resp,Object o) throws Exception{
//获取当前请求的单元方法的方法对象
Method method=((HandlerMethod)o).getMethod();
//执行单元方法
String invoke=(String)method.invoke(myController,null);//返回请求转发的字符串(返回的是所请求的单元方法的return "xx"中的xx)
req.getRequestDispatcher(invoke).forward(req,resp);
//放行
return true;
}
@Override
public void postHandle(HtteServletRequest req,HttpServletResponse resp,Object o,ModeAndView modelAndView) throws Exception{
//获取所请求单元方法的返回值
String returnString=modelAndView.getViewName();
//获取Model存储的数据
String str=(String)modelAndView.getModel().get("str");
//替换敏感词
if(str.contains("敏感词")){
str=str.replace("敏感词","**");
}
modelAndView.getModel().put("str",str);
//修改view的路径,实现资源保护
modelAndView.setViewName("busy.jsp");
}
@Override
public void afterCompletion(HttpServletRequest req,HttpServletResponse resp,Object o,Exception e) throws Exception{
//捕获异常
if(null != null){
resp.getWriter().write("server is busy.");
}
}
}
- 在SpringMVC的配置文件中配置拦截范围及拦截器bean
<mvc:interceptors>
//配置拦截MyInterceptor类中所有单元方法
<bean id="my2" class="cn.khue.interceptor.MyInterceptor"/>
//配置拦截MyInterceptor类中指定单元方法
<mvc:interceptor>
<mvc:mapping path="/test"/>
<bean id="my" class="cn.khue.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>