在Spring Controller中加载静态文件

Ste*_*anS 11 java spring-mvc

我是Spring的新手,如果我在这里看不到明显的答案,那么道歉.

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

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

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

ska*_*man 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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<mvc:view-controller path="/test" view-name="/WEB-INF/content/somecontent.txt"/>
Run Code Online (Sandbox Code Playgroud)

请参阅文档了解其功能,但这可能意味着您可以避免使用任何代码.


jav*_*nna 9

FileReader的表示法"file:"和"classpath:"不正确.我建议你创建一个FileSystemResource

FileSystemResource resource = new FileSystemResource("/WEB-INF/content/somecontent.txt");
Run Code Online (Sandbox Code Playgroud)

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


axt*_*avt 6

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

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

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

甚至(如果有的话InternalViewResolver):

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

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