08 октября 2008

File Uploading with Spring Framework

Наверное ни один веб портал не может обойтись без такой операции как загрузка файлов на сервер.
Особенно актуальная єта задача для больших веб приложений, которые разрабатываются в основном на java ee.
В  этой заметке я рассмотрю как осуществляется аплоад файлов при использовании Spring фрэймоврка 2.5 (с использованием аннотаций).

Сначала нам необходимо зарегистрировать специальный бин - MultipartResolver, который будет сканировать все запросы к серверу и искать формы с типом multipart (т.е. с файлом для загрузки на сервер). Если такая форма найдётся этот бин передаст её для дальнейшей специальной обработки в сервлет MultipartHttpServletRequest, который и закачает наш файл.
<!-- MultipartResolver for parsing file uploads, implementation for Commons FileUpload -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
Всё это Spring сам делать не умеет, но хорошо это умеет делать Apache Commons FileUpload,
функциональность которого и вызывается через Spring Framework. Так что необходимо подключить commons-fileupload.jar и commons-io.jar библиотеки.

Настройка завершена, теперь код.
Создаём jsp страничку с multipart формой и единственным параметром file типа file. Назовём её например uploadFile.jsp:
<form action="uploadFile.html" method="post" encType="multipart/form-data">
  <tr>
      <td>Content</td>
     <td><input type="file" name="file"><br></td>
  </tr>
  <tr>
      <td colspan="2"><input type="submit" value="Upload file"></td>
  </tr>
</form>
 
Создаём класс контроллера.
Нам необходимо обрабатывать минимум 2 запроса. Первый - для отображения формы, через которую будет производиться загрузка файла, второй для обработки непосредственной загрузки файла (submit формы).
Например:
@Controller
class UploadController {

    @RequestMapping(value = "/file.html", method = RequestMethod.GET)
    public String setupUploadFile(){
        return "uploadFile";
    }
   
    @RequestMapping(value = "/uploadFile.html")   
    public String processUploadPreview(
            @RequestParam("file") MultipartFile file
            ){
      // Сохраняем файл на диск...
      // Содержание загруженного файла можно получить с помощь:
      // file.getInputStream()
      // имя и расширения файла можно извлечь из свойств
      // file.getName() , file.getContentType()
        return "redirect:index.html";
    } 
}


Это всё. Можно переходить к тестированию.

1 комментарий:

Анонимный комментирует...

такой вопросик. в спринге начиная с версии 2.0 появился так называемый spring form tag.
возможно ли его использовать для того чтобы сделать аналог input type="file" ? так не хочется юзать spring:bind