文件无法在 Magnolia 中上传
File is not able to upload in 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()) {
...
...
}
}
型号Class如下:
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
提交表单时无法获取文件。
它没有设置 "Photo" 字段。
所以我在检索照片字段时在 Controller 中收到 NullPointerException。
谁能告诉我问题出在哪里?
我该如何解决这个问题?
很可能是 Magnolia 挡住了您的路...应该很容易验证。在您获得 NPE 之前,在您的控制器中,尝试调用 MgnlContext.getParameter("Photo")
并查看您得到了什么。或者要查看整个发布的表格,您也可以执行 MgnlContext.getPostedForm()
.
如果您确认确实是 Magnolia 保存了该字段的值,您可以忘记自己处理字段并让 Magnolia 为您处理多部分,或者如果这不是您想要的,您可以为 MultipartFilter
配置旁路在 config:/server/filters/multipartRequest
中告诉 Magnolia 不要触摸任何进入你的控制器 uri 的东西。
如果以上方法没有帮助,您可以尝试在过滤器链中添加 info.magnolia.debug.DumpHeadersFilter
(上下文过滤器之后的任何位置)并在日志中查看它告诉您的有关传入请求的内容。尽管名称如此,它也会打印出参数和值。也许这可以给你一些线索。
HTH,
一月
如果您使用的是 Magnolia Blossom,它带有自己的多部分解析器,它似乎透明地环绕着 Magnolia 的多部分过滤器,因此您不必绕过后者或使用变通方法获取上传的文件。
用 info.magnolia.module.blossom.multipart.BlossomMultipartResolver 替换我的 CommonsMultipartResolver bean(如 here 所述)解决了我非常相似的问题,我的 MultipartFile 字段在已上传表格。
我有下面的控制器:
@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()) {
...
...
}
}
型号Class如下:
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
提交表单时无法获取文件。 它没有设置 "Photo" 字段。
所以我在检索照片字段时在 Controller 中收到 NullPointerException。
谁能告诉我问题出在哪里?
我该如何解决这个问题?
很可能是 Magnolia 挡住了您的路...应该很容易验证。在您获得 NPE 之前,在您的控制器中,尝试调用 MgnlContext.getParameter("Photo")
并查看您得到了什么。或者要查看整个发布的表格,您也可以执行 MgnlContext.getPostedForm()
.
如果您确认确实是 Magnolia 保存了该字段的值,您可以忘记自己处理字段并让 Magnolia 为您处理多部分,或者如果这不是您想要的,您可以为 MultipartFilter
配置旁路在 config:/server/filters/multipartRequest
中告诉 Magnolia 不要触摸任何进入你的控制器 uri 的东西。
如果以上方法没有帮助,您可以尝试在过滤器链中添加 info.magnolia.debug.DumpHeadersFilter
(上下文过滤器之后的任何位置)并在日志中查看它告诉您的有关传入请求的内容。尽管名称如此,它也会打印出参数和值。也许这可以给你一些线索。
HTH,
一月
如果您使用的是 Magnolia Blossom,它带有自己的多部分解析器,它似乎透明地环绕着 Magnolia 的多部分过滤器,因此您不必绕过后者或使用变通方法获取上传的文件。
用 info.magnolia.module.blossom.multipart.BlossomMultipartResolver 替换我的 CommonsMultipartResolver bean(如 here 所述)解决了我非常相似的问题,我的 MultipartFile 字段在已上传表格。