我是Spring MVC的新手,需要在浏览器中显示本地文件夹的内容(也可能是NAS)。该文件夹包含PDF文件,我想将其列为URL。点击其中任何一个,我应该能够在PDF阅读器中查看相关文件。我的应用服务器是Tomcat。
在运行应用程序时,我可以将文件视为超链接,但点击它会提供HTTP 404.我想我错过了某些配置。我已经尝试了所有可能的设置,甚至搜索了很长时间,但还没有让它工作。
有人可以让我知道我哪里出错了或者我可能错过了什么?
我的dispatcher-servlet.xml如下所示:
<context:component-scan base-package="com.springapp.mvc"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
Web.xml中:
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
的index.jsp:
<c:if test="${not empty dir}">
<ul>
<c:forEach var="listValue" items="${dir}">
<%--<li>${listValue}</li>--%>
<%--<li><a href="${listValue}">${listValue}</a></li>--%>
<li><a href="<c:url value="${listValue}"/>">${listValue}</a></li>
</c:forEach>
</ul>
</c:if>
和控制器类:
@Controller
@RequestMapping("/")
public class DirListController extends AbstractController {
private File[] getPdfFileListing() {
File dir = new File("//Users//username//Documents"); // current directory
return dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".pdf");
}
});
}
@Override
@RequestMapping(method = RequestMethod.GET)
protected ModelAndView handleRequestInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//return back to index.jsp
File[] files = getPdfFileListing();
ModelAndView model = new ModelAndView("index");
model.addObject("dir", files);
return model;
}
}
答案 0 :(得分:0)
一次访问整个目录可能不会起作用。但是,如果使用byte
作为返回类型,则可以执行的操作是将每个链接的单个文件作为ResponseEntity
数组返回。然后,您可以在PDF查看器中打开它。
使用Spring 3.2.5,Tomcat 7测试了这一点并添加了Apache Commons IO 1.3.2作为依赖项(对于FileUtils
类)。
private static final String DIRECTORY = "/Users/username/Documents/";
@RequestMapping(method = RequestMethod.GET, params = "fileName")
@ResponseBody
protected ResponseEntity<byte[]> handleFileRequest(HttpServletRequest request, HttpServletResponse response,
@RequestParam String fileName) throws Exception {
// Change below to proper logger, if you have one configured.
System.out.println("Trying to find file: " + fileName +
" from directory: " + DIRECTORY + ".");
File pdfFile = new File(DIRECTORY + fileName);
byte[] bytes = FileUtils.readFileToByteArray(pdfFile);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/pdf"));
headers.setContentLength(bytes.length);
headers.setContentDispositionFormData("filename", fileName);
return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
}
因此,您必须在URL中的链接中添加fileName
请求参数,您可以在其中定义要调用的文件。例如:
<a href="http://localhost:8080/myApp?fileName=test.pdf">Open test.pdf</a>