文件无法在Magnolia中上传

时间:2015-06-02 10:17:22

标签: spring-mvc magnolia

我有以下控制器:

 @Controller

 public class UploadComponent {

 private static final Logger logger = LoggerFactory.getLogger(UploadComponent.class);

 @RequestMapping("/uploadFile")
 public String render(@ModelAttribute("fileUpload") FileUpload fileUpload, ModelMap model)throws RepositoryException {

    return "components/upload.jsp";
 }

 @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
 public  String uploadFileHandler(@ModelAttribute("fileUpload") FileUpload fileUpload, HttpServletRequest request) {

    logger.info("post method executed");
    CommonsMultipartFile file = fileUpload.getPhoto();

    if (!file.isEmpty()) {
    ...
    ...
    }
 }

模型类如下:

public class FileUpload implements Serializable {

CommonsMultipartFile photo;
String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public CommonsMultipartFile getPhoto() {
    return photo;
}

public void setPhoto(CommonsMultipartFile photo) {
    this.photo = photo;
}
}
}

我的Jsp如下:

    <form:form commandName="fileUpload" method="POST"action="uploadFile" 
    enctype="multipart/form-data">

          File to upload: <form:input type="file" path="Photo" class="pp_text" /><br /> 
          Name: <form:input type="text" path="name" class="pp_button" /><br /> <br /> 
          <input type="submit" value="Upload"> Press here to upload the file!

    </form:form>

我在applicationContext.xml文件中配置了CommonsMultipartResolver

当我提交表单时,我无法获取该文件。 它没有设置“照片”字段。

所以我在检索照片字段时在Controller中得到NullPointerException。

有谁能建议我哪里存在问题?

如何解决此问题?

2 个答案:

答案 0 :(得分:2)

最有可能的是,Magnolia会妨碍你......应该很容易验证。在您获得NPE之前的控制器中,尝试拨打MgnlContext.getParameter("Photo")并查看您获得的内容。或者,要查看整个发布的表单,您也可以执行MgnlContext.getPostedForm() 如果您确认Magnolia确实拥有该字段的值,您可以自己忘记处理字段并让Magnolia为您处理多部分,或者如果这不是您想要的,您可以为MultipartFilter配置旁路在config:/server/filters/multipartRequest中告诉Magnolia不要接触任何进入你的控制器的东西。

如果以上情况没有帮助,您可以尝试在过滤器链中添加info.magnolia.debug.DumpHeadersFilter(在上下文过滤器之后的任何位置),并在日志中查看它告诉您有关传入请求的内容。尽管名称,它还将打印出params和值。也许这可以给你一些线索。

HTH,

答案 1 :(得分:1)

如果您正在使用 Magnolia Blossom ,它会附带自己的多部分解析器,它似乎透明地包裹Magnolia的多部分过滤器,这样您就不必绕过后者或使用变通方法到达上传的文件。

用info.magnolia.module.blossom.multipart替换我的CommonsMultipartResolver bean。 BlossomMultipartResolver (如上所述here)解决了我的类似问题,其中我的MultipartFile字段在上传时始终为null形式。