2013-10-26 3 views
0

Я занимаюсь разработкой сети, которая имеет функцию загрузки PDF-файлов. Но у меня ошибка.Spring MVC загрузить файл в каталог сервера

Вот что ив сделал до сих пор:

Multipart распознаватель:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
    <!-- one of the properties available; the maximum file size in bytes --> 
    <property name="maxUploadSize" value="10000000"/> 
</bean> 

форма, которая будет загружать:

<form:form commandName="fileUpload" action="../admin/uploadPDF.do" method="post" enctype="multipart/form-data"> 
    <form:label path="fileData">Upload a File</form:label> <br /> 
    <form:input type="file" path="fileData" /> 
    <input type="submit" value="upload" > 
</form:form> 

контроллер, что поймать первый запрос раз, когда пользователь пришел, чтобы загрузить page, AdminController.java

@RequestMapping(value = "/admin/module", method = RequestMethod.GET) 
    public String student(@RequestParam(defaultValue = "") 
    String message, @RequestParam(defaultValue = "") 
    String messageType, HttpServletRequest request, ModelMap model) 
    { 
     model.addAttribute("message", message); 
     model.addAttribute("messageType", messageType); 
     model.addAttribute(new UploadItemBean()); 
     HttpSession session = request.getSession(); 
     String returnVal = Credentials.checkSession(session); 

     if(returnVal != null) 
     { 
      return returnVal; 
     } 

     return "als-student/module"; 
    } 

контроллер, который будет поймать запрос, когда файл загрузки представляется, UploadController.java

@RequestMapping(value = "*/uploadPDF", method = RequestMethod.POST) 
public String getPDF(@RequestParam(defaultValue = "") 
String message, @RequestParam(defaultValue = "") 
String messageType, @RequestParam("name") 
String name, @RequestParam("file") 
MultipartFile file, HttpServletRequest request, ModelMap model) 
{ 
    ... 
    if(!file.isEmpty()) 
    { 
     try 
     { 
      byte[] bytes = file.getBytes(); 
      System.out.println(bytes + ", " + name); 
     } 
     catch(IOException e) 
     { 

      e.printStackTrace(); 
     } 
    } 
    return "als-student/module"; 
} 

StackTrace:

Neither BindingResult nor plain target object for bean name 'fileUpload' available as request attribute 
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:141) 
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168) 
    at org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188) 
    at org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:130) 
    at org.springframework.web.servlet.tags.form.LabelTag.resolveFor(LabelTag.java:120) 
    at org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:90) 
... 
... 

Я также хочу знать, как я могу отправить боб fileUpload в форме, потому что кажется что это тот, который вызывает ошибку. И я также после загрузки файла, как я могу обработать его для сохранения в папку на сервере Apache (если это хорошая практика)?

ответ

1

Этот фрагмент кода

<form:form commandName="fileUpload" action="../admin/uploadPDF.do" method="post" enctype="multipart/form-data"> 
    <form:label path="fileData">Upload a File</form:label> <br /> 
    <form:input type="file" path="fileData" /> 
    <input type="submit" value="upload" > 
</form:form> 

Из-за commandName ожидает модели (запрос) атрибут с ключом fileUpload. Вы, кажется, не класть такой атрибут в Model в обработчике

@RequestMapping(value = "/admin/module", method = RequestMethod.GET) 
public String student(@RequestParam(defaultValue = "") 
String message, @RequestParam(defaultValue = "") 
String messageType, HttpServletRequest request, ModelMap model) 
{ 
    model.addAttribute("message", message); 
    model.addAttribute("messageType", messageType); 
    model.addAttribute(new UploadItemBean()); 
    HttpSession session = request.getSession(); 
    String returnVal = Credentials.checkSession(session); 

    if(returnVal != null) 
    { 
     return returnVal; 
    } 

    return "als-student/module"; 
} 

Я предполагаю, что вы хотите UploadItemBean. Просто измените свой код, чтобы сделать это

model.addAttribute("fileUpload", new UploadItemBean()); 

По умолчанию, если вы не указываете ключ для атрибута, Spring будет генерировать для вас на основе имени класса объекта, который не будет соответствовать ожидаемый fileUpload.

+0

Я вижу, Это решает мою первую проблему. Моя вторая проблема заключается в том, как сохранить загруженный файл в папке на сервере? и не является хорошей практикой? – newbie

+0

@newbie Как вы его сохраняете, зависит от вас. Я предлагаю вам выбрать выделенную папку (создать ее, если она не существует) и написать файл прямо там. Вы можете сделать это с помощью метода 'MultipartFile # transferTo' или напрямую прочитать' InputStream' или 'byte []' и записать его в некоторый 'OutputStream'. Читайте на javadoc 'MultipartFile'. –

+0

Получил, так полезно спасибо – newbie

Смежные вопросы