我在spring mvc项目的控制器中有方法:
//download resume
//----------------------------------------------------------------------
//@RequestMapping(value="/download/{fileName}",method=RequestMethod.GET)
@RequestMapping(value="/downlo",method=RequestMethod.GET)
public void downloadPDFResource(HttpServletRequest request,
HttpServletResponse response){
// @PathVariable("fileName") String fileName) {
//If user is not authorized - he should be thrown out from here itself
String fileName="Ente Kadha - Madhavikkutty.pdf";
//Career c=cardao.retrieveProfile(a_id);
//c.setA_id(a_id);
//String fileName=c.getResumeDoc();
System.out.println("filename i got :"+fileName);
//Authorized user will download the file
String dataDirectory = request.getServletContext().getRealPath("/WEB-INF/downloads/");
Path file = Paths.get(dataDirectory, fileName);
if (Files.exists(file)) {
response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "attachment; filename=" + fileName);
try {
Files.copy(file, response.getOutputStream());
response.getOutputStream().flush();
} catch (IOException ex) {
ex.printStackTrace();
}
}
else
{
System.out.println("\n\nFile not found!!\n\n");
System.out.println(file);
}
}
此代码实际上有效。文件下载成功当我向上述控制器发送请求时,从下面给出的jsp页面:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<!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=ISO-8859-1">
<title>Hello</title>
</head>
<body>
<center>
<h3 name="fileName">Ente Kadha - Madhavikkutty.pdf</h3>
<h2><a href="downlo">Click here to download the file</a></h2>
</center>
</body>
</html>
但是当下载请求从不同的jsp页面转到同一个控制器时,如下所示:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF8">
<title>Profile</title>
</head>
<body>
<table>
<th><h3>${profile.name}</h3></th>
<tr>
<td>Application Id :</td>
<td>${profile.a_id}</td>
</tr>
<tr>
<td>Name :</td>
<td>${profile.name}</td>
</tr>
<tr>
<td>Address :</td>
<td>${profile.address}</td>
</tr>
<tr>
<td>Email:</td>
<td>${profile.email}</td>
</tr>
<tr>
<td>Phone:</td>
<td>${profile.phone}</td>
</tr>
<tr>
<td>Vacancy id:</td>
<td></td>
</tr>
<tr>
<td>Date Applied :</td>
<td>${profile.dateApplied}</td>
</tr>
<tr>
<td>Resume : ${profile.resumePath}${profile.resumeDoc} </td>
<td><a href="downlo">Click here to download the file</a></td>
</tr>
</table>
</body>
</html>
但现在,这给了我一个错误:
HTTP状态400 -
输入状态报告
消息
description客户端发送的请求是语法上的 不正确。
Apache Tomcat / 8.0.3
我真的很困惑为什么会出现这个错误?!! 我请求的方式是一样的,控制器方法是相同的,甚至在两种情况下要下载的文件都是相同的!!
仍然发生错误。任何人都可以帮助我吗? PLS ....
答案 0 :(得分:0)
根据您的问题(和评论)中发布的信息,我认为如下:
在您的控制器中,downloadPDFResource
方法正在侦听网址:/downlo
。如果您的控制器在其类定义上没有其他@RequestMapping
注释,则意味着可以从应用程序的根目录访问下载URL,例如:localhost:8084/IntelliLabsWeb/downlo
。你能证实一下吗?
由于您在<a>
标记中使用了相对链接,因此对于第一种情况,文件恰好位于应用程序的根目录中,因此<a>
标记指向正确的下载URL :localhost:8084/IntelliLabsWeb/downlo
但是,在第二种情况下,您的文件可能位于最可能名为oneProfile
的子文件夹中,<a href>
标记的相对链接指向localhost:8084/IntelliLabsWeb/oneProfile/downlo
,这是没有从downloadPDFResource
方法提供,因此您收到错误400。
尝试将您的第二个链接更改为
<a href="../downlo">Click here to download the file</a>