Загрузите статический файл в Spring Controller - PullRequest
11 голосов
/ 28 февраля 2011

Я довольно новичок в Spring, поэтому извиняюсь, если не вижу здесь очевидного ответа.

Я создал небольшой демонстрационный проект с контроллером Spring MVC и развернул его в App Engine. В моем контроллере я хотел бы прочитать содержимое статического файла в строку. Какой лучший способ сделать это?

Я немного погуглил, но, наверное, ищу не ту вещь. Я попробовал ниже, но это не работает:

@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 ]

15 голосов
/ 28 февраля 2011

Контейнеры сервлетов в целом и GAE в частности не позволят вам использовать 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"/>

Смотрите документацию, чтобы узнать, как это работает , но это может означать, что вы можете избежать любого кода.

9 голосов
/ 28 февраля 2011

Обозначения «file:» и «classpath:» не подходят для FileReader. Я предлагаю вам создать FileSystemResource

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

и затем использовать getFile () или getInputStream () для чтения файла. Это очень полезно в веб-приложении, потому что вы можете использовать относительный путь.

6 голосов
/ 28 февраля 2011

Вы уверены, что вам нужно преобразование кодировки, введенное путем чтения содержимого файла через 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";
}

Если да, учтите, что вы не указали кодировку при чтении файла,эта системная кодировка по умолчанию используется, а поведение вашего приложения зависит от системы.

1 голос
/ 28 февраля 2011

Поскольку это приложение 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()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...