Загрузите статический файл в контроллер 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;
}
}
Любое нажатие в правильном направлении будет высоко оценено: -)
Ответы
Ответ 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()));