Spring文件上传和持久化对象

时间:2013-05-02 13:34:17

标签: spring spring-form

我有一个有两个提交按钮的表单。保存按钮将对象保存到数据库,同时将上载文件保存到本地目录。发送按钮会自动向收件人生成电子邮件。

到目前为止我有什么

    @RequestMapping(value = "/staff/setter/addPage", method = RequestMethod.POST)
public String processModule(@RequestParam("name") String name,
        @RequestParam("file") MultipartFile file, @ModelAttribute("module") 

      Module module, Staff staff, HttpServletRequest request, BindException errors,
      HttpSession session) {    

           if( request.getParameter("save") != null )
              {
     if(module != null){

         try {

             MultipartFile filea = module.getFileData();

             InputStream inputStream = null;
             OutputStream outputStream = null;
             if (filea.getSize() > 0) {
             inputStream = filea.getInputStream();
             outputStream = new FileOutputStream("C:\\Test\\"
             + filea.getOriginalFilename());
             System.out.println("==========Uploaded File 

                   Name=========");
             System.out.println(filea.getOriginalFilename());


                    System.out.println("====================================");
             int readBytes = 0;
             byte[] buffer = new byte[8192];
             while ((readBytes = inputStream.read(buffer, 0, 8192)) != 

              -1) {
             outputStream.write(buffer, 0, readBytes);
             }
             outputStream.close();
             inputStream.close();
             session.setAttribute("success", "File Uploaded 

           Successfully");
             session.setAttribute("uploadFile", "C:\\Test\\"
             + filea.getOriginalFilename());
             }
             } catch (Exception e) {
             e.printStackTrace();
             }


 //Save specific processing
     moduleService.save(module);
     }
     return "redirect:/staff/setter/addPage";   
 }

 else if( request.getParameter("send") != null )
 {
  //Send specific processing.
     SimpleMailMessage msg = new SimpleMailMessage(this.templateMessage);
     //msg.setTo(module.getCustomer().getEmailAddress());
     msg.setTo(module.getChecker().getEmail());
     //msg.setTo(staff.getChecker().getEmail());

     msg.setText(
         "Dear " + module.getChecker().getName()
         //"Dear " + staff.getChecker().getEmail()
             //+ module.getCustomer().getLastName()
             + "a coursework has been submitted for checking"
             + module.getModuleCode()
             +module.getModuleName());
     try{
         this.mailSender.send(msg);
     }
     catch(MailException ex) {
         // simply log it and go on...
         System.err.println(ex.getMessage());   

 }

 }
return "/staff/setter/view_submission";
}

到目前为止,错误是

      HTTP Status 400 - The request sent by the client was syntactically incorrect.

我将不胜感激。

编辑:Jsp页面

  <c:url var="processUrl" value="/staff/setter/addPage" />
 <form:form modelAttribute="module" method="POST" action="${processUrl}" name="module" 

  enctype="multipart/form-data">

   <form:hidden path="moduleId" />

    <div class="admin">
<table>

    <tr>

        <td class="module">

        </td>
        <td>Module Code:</td>

        <td>Module Name:</td>

    </tr>
    <tr>
    <td>Convenor:</td>
    <td>Checker:</td>

</tr>
<tr>
    <td>Weights:</td>
</tr>

  </table>
  </div>


<div class ="lecturer">
<h4>Lecturer Section</h4>
<ul>


<form:label path="fileName">Document Title:</form:label>
<form:input path="fileName" name="name"/><br/>

<form:label path="documentPath">Coursework Sample:</form:label>
<form:input path="documentPath" type="file" name="file" id="file"/><br/>

 <form:label path="liveDate">Live Date:</form:label>
<form:input path="liveDate"/><br/>

 <form:label path="submissionDate">Submission Date:</form:label>
 <form:input path="submissionDate"/><br/>

 <form:label path="filename">Marked Sample Title:</form:label>
  <form:input path="filename" id="file" name="name"/><br/>

 <form:label path="markedSamplePath">Marked Sample:</form:label>
 <form:input path="markedSamplePath" type="file" name="file"/><br/>

 </ul>

</div>

 </form:form>

1 个答案:

答案 0 :(得分:1)

如果您想避免处理多部分表单的麻烦,并可能为用户提供更好的体验。例如,您的表单数据有错误,用户需要重新提交表单,您的文件上载将丢失。

我使用fineuploader构建一个上传的文件作为隐藏的输入,上传自己是单独的请求。

在此解释:Preserving value for <form:input type="file"> with Spring MVC