在Spring Controller中加载静态文件

时间:2011-02-28 19:25:03

标签: java spring-mvc

我对Spring很陌生,如果我在这里看不到明显的答案,请道歉。

我使用Spring MVC控制器设置了一个小型演示项目,并将其部署到App Engine。在我的控制器中,我想将静态文件的内容读入String。这样做的最佳方式是什么?

我搜索了一下,但我可能正在寻找错误的东西。我尝试了以下,但它不起作用:

@Controller
@RequestMapping("/myController")
public class MyController {

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public @ResponseBody String myTest() {

        FileReader fileReader = null;
        BufferedReader bufferedReader = null;
        String content = "";
        try {
            fileReader = new FileReader("file:/WEB-INF/content/somecontent.txt");
            bufferedReader = new BufferedReader(fileReader);
            content = bufferedReader.readLine();
            bufferedReader.close(); 
        }
        catch (Exception ignored) { 
            // ignore
        }
        return content;
    }
}

任何向正确方向的推动都将受到高度赞赏: - )

4 个答案:

答案 0 :(得分:15)

一般来说,Servlet容器,特别是GAE,不允许您在servlet容器中使用File API。

相反,使用ServletContext自动装入控制器,并从中获取资源。此外,您的异常处理不是很好,您不应该忽略这样的异常,它们是有原因的。

应该没事:

@Controller
@RequestMapping("/myController")
public class MyController {

    private @Autowired ServletContext servletContext;

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public @ResponseBody String myTest() throws IOException {
        InputStream inputStream = null;
        try {
            inputStream = servletContext.getResourceAsStream("/WEB-INF/content/somecontent.txt");
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            return bufferedReader.readLine();
        } finally {
            if (inputStream != null) {
               inputStream.close();
            }
        }
    }
}

或者,如果你使用Spring 3.x,这可能更简单:

<mvc:view-controller path="/test" view-name="/WEB-INF/content/somecontent.txt"/>

See docs for what this does,但这可能意味着您可以避免任何代码。

答案 1 :(得分:9)

使用FileReader,表示法“file:”和“classpath:”不正确。 我建议你创建一个FileSystemResource

FileSystemResource resource = new FileSystemResource("/WEB-INF/content/somecontent.txt");

然后使用getFile()或getInputStream()来读取文件。 这在Web应用程序中非常有用,因为您可以使用相对路径。

答案 2 :(得分:6)

您确定需要通过Reader阅读文件内容并将其作为String返回来引入编码转换吗?

如果不是(即如果您要按原样提供文件),则可以使用请求转发:

@RequestMapping(value = "/test", method = RequestMethod.GET)
public View myTest() {
    return new InternalResourceView("/WEB-INF/content/somecontent.txt");
}

或甚至(如果您有InternalViewResolver):

@RequestMapping(value = "/test", method = RequestMethod.GET)
public String myTest() {
    return "forward:/WEB-INF/content/somecontent.txt";
}

如果是,请注意您在读取文件时未指定编码,因此使用系统默认编码,并且应用程序的行为取决于系统。

答案 3 :(得分:1)

由于这是一个Spring应用程序,您可以依赖它的类来帮助解决这个问题。特别是,org.springframework.web.context.support.ServletContextResource应该证明非常有用:

ServletContextResource resource = new ServletContextResource(servletContext, 
    "/WEB-INF/content/somecontent.txt");

BufferedReader bufferedReader = new BufferedReader(
    new InputStreamReader(resource.getInputStream()));