2013-03-07 117 views
1

更新:我已經注意到空值傳遞的原因是enctype="multipart/form-data",但是爲了將文件傳遞給控制器​​需要該部分。下面的問題依然存在。使用Spring MVC上傳文件


我一直在試圖建立一個Spring MVC頁面,允許用戶上傳文檔。我環顧四周,似乎有一個關於如何執行此操作的常識(使用「commons-fileupload」和「commons-io」),因此以下是我的視圖,控制器和模型。

查看:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 
<%@ page session="false" %> 
<html> 
<head> 
<title>Upload Document</title> 
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
    <script type="text/javascript">  

    </script> 
    <script type="text/javascript" src="resources/rulesextractor.js"></script> 
    <link rel="stylesheet" type="text/css" href="./resources/css/rulesextractor.css" />  
</head> 
<body> 
<c:import url = "./header.jsp"> 
    <c:param name = "title" value = "Upload Document"/> 
    <c:param name = "region" value = "${region}"/> 
</c:import> 
<br> 
    Please choose a Document to upload 
<br> 

<form:form method="POST" modelAttribute="uploadForm" commandName="uploadForm" name="uploadForm" id="uploadForm" enctype="multipart/form-data"> 
    <form:input path="fileData" name="fileData" type="file"/> 
<br> 
    <input type="submit" name="submit" value="Submit" id="subbtn"/> 
    <input type="button" value="Main Menu" onclick="back();"/> 
</form:form> 

</body> 
</html> 

控制器:

@Controller 
public class UploadController extends BaseController { 
private static final Logger logger = LoggerFactory.getLogger(FlowController.class); 

//@Autowired 
//private UserPreferences userPreferences; 

@Autowired 
GenericSearchBO genericSearchBO; 

@RequestMapping(value = "upload", method = RequestMethod.GET) 
public String getUploadPage(Model m){ 
    logger.info("UploadController: Getting Upload page"); 
    updateRegionOnModel(m); 
    m.addAttribute(new UploadForm()); 
    return "/pages/upload"; 
} 
@RequestMapping(method = RequestMethod.POST) 
public String create(@Valid UploadForm UploadForm, BindingResult result){ 
    if (result.hasErrors()) 
    { 
     for(ObjectError error : result.getAllErrors()) 
     { 
     System.err.println("Error: " + error.getCode() + " - " + error.getDefaultMessage()); 
     } 
     return "/pages/upload"; 
    } 

    // Some type of file processing... 
    System.err.println("-------------------------------------------"); 
    //.getOriginalFilename() 
    System.err.println("Test upload: " + UploadForm.getFileData()); 
    System.err.println("-------------------------------------------"); 

    return "redirect:/pages/upload"; 
} 
} 

型號:

public class UploadForm { 

private CommonsMultipartFile fileData; 

public CommonsMultipartFile getFileData() { 
    System.out.println("REACHED GET METHOD"); 
    return fileData; 
} 
public void setFileData(CommonsMultipartFile fileData) { 
    System.out.println("REACHED SET METHOD"); 
    this.fileData = fileData; 
} 
} 

我是新來的春天,和MVC一般,但我慢慢變的它掛了。這裏的問題是,我實際上正在進入控制器的public String create(@Valid UploadForm UploadForm, BindingResult result)方法,但UploadForm被作爲空值傳遞,我不能在我的生活中找到它,並且它變得非常令人沮喪。任何幫助或提示將不勝感激。謝謝!

回答

0

這是achievbale使用的multipart/form-data的

<form:form id="" action="xxx.do" method="post" 
     modelAttribute="uploadFile" enctype="multipart/form-data"> 
<form:input path="data" id="data" type="file" /> 
</form:form> 

Model類

public class uploadFile{ 
     private CommonsMultipartFile data; 
     //getter and setter 
} 

在控制器

@RequestMapping(value = "/upload", method = RequestMethod.POST) 
public ModelAndView fileUpload(uploadFile fileuploaded, 
           BindingResult result, 
           HttpSession session){ 
         ... 
} 

讀取文件

BufferedReader br = new BufferedReader(
new InputStreamReader(fileuploaded.getFileData().getInputStream())); 
+0

的問題是,雖然說我仍然得到了'java.lang.NullPointerException'。我不相信用戶正在上傳的文件正在使用set方法傳遞給模型。因爲我相信這是因爲get方法的'System.out.println(「REACHED GET METHOD」);'正在到達,但模型的set方法的'System.out.println(「REACHED SET METHOD」);'是不。 – 2013-03-07 16:10:08

1

在你servlet.xml中必須添加:

<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="100000"/> 
</bean>