2013-03-07 72 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>