Подтвердить что ты не робот

Загрузите статический файл в контроллер Spring

Я новичок в 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;
    }
}

Любое нажатие в правильном направлении будет высоко оценено: -)

4b9b3361

Ответ 1

Обозначение "file:" и "classpath:" неверно с FileReader. Я предлагаю вам создать файл FileSystemResource

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

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

Ответ 2

Контейнеры сервлетов в целом и GAE, в частности, не позволят вам использовать API файлов из контейнера сервлетов.

Вместо этого запустите autowire ваш контроллер с помощью 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"/>

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

Ответ 3

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

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

Ответ 4

Поскольку это приложение 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()));