文件无法在 Magnolia 中上传

Posted

技术标签:

【中文标题】文件无法在 Magnolia 中上传【英文标题】:File is not able to upload in Magnolia 【发布时间】:2015-06-02 10:17:21 【问题描述】:

我有下面的控制器:

 @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。

谁能告诉我问题出在哪里?

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

很可能是 Magnolia 妨碍了您……应该很容易验证。在您获得 NPE 之前,在您的控制器中,尝试调用 MgnlContext.getParameter("Photo") 并查看您得到了什么。或者要查看整个发布的表格,您也可以MgnlContext.getPostedForm()。 如果您确认确实是 Magnolia 持有该字段的值,您可以自己忘记处理字段并让 Magnolia 为您处理多部分,或者如果这不是您想要的,您可以在 @ 中为 MultipartFilter 配置绕过987654325@ 告诉 Magnolia 不要触摸任何进入控制器 uri 的东西。

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

HTH, 一月

【讨论】:

嗨@Jan,我想我得到了一些东西。当我执行 MgnlContext.getPostedForm().getDocument("file").getFile() 时,我得到的输出为:E:\Workspace\.metadata\.plugins\org。 eclipse.wst.server.core\tmp0\wtpwebapps\myproject-webapp\tmp\ico1.png ,当我执行 MgnlContext.getParameter("file") 我得到 NULL 。你能澄清一下这种情况吗?为什么我会得到? 哎呀。我的错。我应该正确阅读javadoc。它确实说“将参数值作为字符串获取”。所以我假设如果它不能返回字符串,对于文件它不能,它会响应 w/ null 。很高兴至少另一种方式对你有用。 nexus.magnolia-cms.com/content/sites/magnolia.public.sites/ref/…【参考方案2】:

如果您使用的是 Magnolia Blossom,它带有自己的多部分解析器,似乎透明地包裹了 Magnolia 的多部分过滤器,因此您不必绕过后者或使用解决方法获取上传的文件。

用 info.magnolia.module.blossom.multipart 替换我的 CommonsMultipartResolver bean。BlossomMultipartResolver(如 here 所述)解决了我非常相似的问题,即我的 MultipartFile 字段在上传的表单中始终为空。

【讨论】:

这是完美的解决方案。

以上是关于文件无法在 Magnolia 中上传的主要内容,如果未能解决你的问题,请参考以下文章

基本 Magnolia 项目无法启动

Magnolia 原型无法解析 info.magnolia.ui:magnolia-ui-project:pom:5.3

在 Magnolia:用 MySQL 替换 H2:JackRabbit 无法实例化持久性管理器

在 Magnolia RichTextField 中配置 CKEDITOR 的问题

Magnolia Demo 项目 mvn build 由于无法获取 magnolia-setproperty-maven-plugin 而失败

Magnolia CMS 5 中的模板文件夹