2015-06-06 84 views
0

我有一個jsp頁面,其中我使用了彈簧窗體標籤,以便我可以使用模型屬性並將數據綁定到該頁面。它在提交表單時工作得很好,但添加enctype="multipart/form-data"後,模型屬性向控制器返回null。這裏有什麼問題? 我的代碼 - proflie.jsp使用彈簧形式的文件上傳不能在彈簧mvc中工作

<sf:form method="POST" action="update" modelAttribute="user" class="form-horizontal" > 
    <div class="form-group"> 
     <label for="inputEmail3" class="col-sm-2 control-label">Avatar</label> 
     <div class="col-md-6"> 
      <div class="media v-middle"> 
       <div class="media-left"> 
        <div class="icon-block width-100 bg-grey-100"> 
         <i class="fa fa-photo text-light"></i> 
        </div> 
       </div> 
       <div class="media-body"> 
        <i class="fa fa-upl"><sf:input path="imageFile" type="file" class="btn btn-white btn-sm paper-shadow relative" placeholder="Add Image" id="imageFile" /> 
        </i> 
       </div> 
      </div> 
     </div> 
    </div> 
    <div class="form-group"> 
     <label for="inputEmail3" class="col-md-2 control-label">Full Name</label> 
     <div class="col-md-8"> 
      <div class="row"> 
       <div class="col-md-6"> 
        <div class="form-control-material"> 
         <sf:input path="firstName" type="text" class="form-control" id="firstName" placeholder="Your first name" value="${user.firstName}" /> 
         <sf:input path="id" type="hidden" class="form-control" id="id" value="${user.id}" /> 
         <label for="firstName">First name</label> 
        </div> 
       </div> 
       <div class="col-md-6"> 
        <div class="form-control-material"> 
          <sf:input path="lastName" class="form-control" id="lastName" placeholder="Your last name" value="${user.lastName}" /> 
         <label for="lastName">Last name</label> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
    <div class="form-group"> 
     <label for="inputEmail3" class="col-md-2 control-label">Email</label> 
     <div class="col-md-6"> 
      <div class="form-control-material"> 
       <div class="input-group"> 
        <span class="input-group-addon"><i class="fa fa-envelope"></i></span> 
        <sf:input path="email" type="email" class="form-control" id="inputEmail3" placeholder="Email" value="${user.email}" /> 
        <label for="inputEmail3">Email address</label> 
       </div> 
      </div> 
     </div> 
    </div> 
    <div class="form-group"> 
     <label for="inputEmail3" class="col-md-2 control-label">Phone</label> 
     <div class="col-md-6"> 
      <div class="form-control-material"> 
       <div class="input-group"> 
        <span class="input-group-addon"><i class="fa fa-envelope"></i></span> 
        <sf:input path="phone" type="number" class="form-control" id="inputEmail3" placeholder="Phone" value="${user.phone}" /> 
        <label for="phone">Phone</label> 
       </div> 
      </div> 
     </div> 
    </div> 
    <div class="form-group"> 
     <label for="inputEmail3" class="col-md-2 control-label">Address</label> 
     <div class="col-md-6"> 
      <div class="form-control-material"> 
       <div class="input-group"> 
        <span class="input-group-addon"><i class="fa fa-link"></i></span> 
        <sf:input path="address" type="text" class="form-control used" id="website" placeholder="Address" value="${user.address}" /> 
        <label for="address">Address</label> 
       </div> 
      </div> 
     </div> 
    </div> 
    <div class="form-group"> 
     <label for="inputPassword3" class="col-md-2 control-label">Change Password</label> 
     <div class="col-md-6"> 
      <div class="form-control-material"> 
       <sf:input path="password" type="password" class="form-control" id="inputPassword3" placeholder="Password" value="${user.password}" /> 
       <label for="password">Password</label> 
      </div> 
     </div> 
    </div> 

    <div class="form-group margin-none"> 
     <div class="col-md-offset-2 col-md-10"> 
      <button type="submit" class="btn btn-primary paper-shadow relative" data-z="0.5" data-hover-z="1" data-animated>Save Changes</button> 
     </div> 
    </div> 
</sf:form> 

AccountController類

package com.vc.teacher.controller; 

import java.io.File; 

import org.apache.commons.io.FileUtils; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.servlet.mvc.support.RedirectAttributes; 

import com.vc.teacher.db.dao.UserDao; 
import com.vc.teacher.entities.User; 
import com.vc.teacher.util.Constants; 

@Controller 
public class AccountController { 

    @Autowired 
    UserDao userDao; 

    @RequestMapping("/login") 
    public String loginUser(@RequestParam("email") String email, 
      @RequestParam("password") String password, Model model) { 

     User user = userDao.checkCreditionals(email, password); 
     if (user != null) { 
      model.addAttribute("user", user); 
      return "jsp/profile"; 
     } else { 
      model.addAttribute("error", "Wrong creditionals"); 
      return "jsp/signin"; 
     } 

    } 

    @RequestMapping("/signUp") 
    public String initilize(Model model) { 
     model.addAttribute(new User()); 
     return "jsp/signup"; 
    } 

    @RequestMapping(method = RequestMethod.POST, value = "/register") 
    public String signUpUser(User user, RedirectAttributes attributes) { 
     boolean result = false; 
     File imageFile = null; 

     try { 
      imageFile = user.getImageFile(); 

      if (imageFile != null) { 
       File imageFileSave = new File(Constants.MEDIA_FILE_PATH); 
       FileUtils.copyFile(imageFile, imageFileSave); 
       user.setImageFileName(imageFile.getName()); 
      } 

      user.setStatus("Deactive"); 
      result = userDao.registerUser(user); 

      if (result == true) { 
       attributes.addFlashAttribute("message", 
         "You are ready to go now !"); 
       return "redirect:/signUp"; 
      } else { 
       attributes.addFlashAttribute("message", "Something went wrong"); 
       return "redirect:/signUp"; 
      } 

     } catch (Exception e) { 
      attributes.addFlashAttribute("message", "Something went wrong"); 
      return "redirect:/signUp"; 
     } 

    } 

    @RequestMapping(method = RequestMethod.POST, value = "/update") 
    public String updateUser(User user, RedirectAttributes attributes) { 
     boolean result = false; 
     File imageFile = null; 

     try { 
      System.out.println("=================================="+user.getEmail()); 
      System.out.println("=================================="+user.getId()); 
      System.out.println("=================================="+user.getFirstName()); 

      imageFile = user.getImageFile(); 

      if (imageFile != null) { 
       File imageFileSave = new File(Constants.MEDIA_FILE_PATH); 
       FileUtils.copyFile(imageFile, imageFileSave); 
       user.setImageFileName(imageFile.getName()); 
      } 

      user.setStatus("Active"); 
      result = userDao.updateUser(user); 

      if (result == true) { 
       attributes.addFlashAttribute("message", "Profile Updated !"); 
       return "jsp/profile"; 
      } else { 
       attributes.addFlashAttribute("message", "Something went wrong"); 
       return "jsp/profile"; 
      } 
     } catch (Exception e) { 
      attributes.addFlashAttribute("message", "Something went wrong"); 
      return "jsp/profile"; 
     } 

    } 
} 

回答

3

就其本身而言,DispatcherServlet的犯規知道如何處理多形式的數據這就是爲什麼我們需要多解析器。在您的用戶對象

<bean id="multipartResolver" 
     class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
     <property name="maxUploadSize" value="500000" /> 
    </bean> 

使用CommonsMultipartFile或MultipartFile,而不是文件:

你應該在你的servlet-Config中註冊它

private CommonsMultipartFile imageFile; 

你可以試試這個代碼來保存文件:

File imageFileSave = new File(Constants.MEDIA_FILE_PATH); 
FileUtils.writeByteArrayToFile(imageFileSave , imageFile.getBytes()); 
+0

它給出這個例外 - 不能轉換類型[org.sp ringframework.web.multipart.commons.CommonsMultipartFile]爲屬性'imageFile'的所需類型[java.io.File]:PropertyEditor [org.springframework.beans.propertyeditors.FileEditor]返回類型爲[org.springframework.web。 multipart.commons.CommonsMultipartFile]] –

+0

@Admit Das檢查更新的答案 – jgr

+0

爲什麼我可以在我的用戶對象中使用File。 –