使用Spring MVC访问本地/共享驱动器

时间:2013-12-31 18:13:47

标签: java jsp spring-mvc

我是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;
    }
}

1 个答案:

答案 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>