我读了很多页但是,我确定,我在某个地方做了一些错误而且我不能按照应该的那样上传文件。
首先,我正在使用Netbeans 7和JDK 1.7在Glassfish 3.1上使用JSF2.0,Primefaces 3.2和JPA2进行开发。
接下来我要说的是,我要将这个代码插入到一个接口中,该接口将从许多其他类扩展,并且应该将文件存储在文件系统的许多文件夹中! 所以现在我将报告我写的内容,请告诉我问题出在哪里!
这是web.xml中的代码:
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
<init-param>
<param-name>uploadDirectory</param-name>
<param-value>D:/Cyborg/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
包含p:uploadFile的页面还包含许多其他表单的字段,我只会复制我认为您感兴趣的内容:
...
<h:form method="POST">
...
<h:outputLabel for="uploadFile" value="#{bundle.LabelUploadFile}" />
<p:fileUpload value="#{progettiController.uploadFile}" mode="simple" />
...
<h:commandLink action="#{progettiController.create}" value="#{bundle.SaveLink}" />
...
这是名为AbstractController的接口代码:
protected UploadedFile uploadFile;
public void setUploadFile(UploadedFile uploadFile) {
this.uploadFile=uploadFile;
}
public UploadedFile getUploadFile() {
return uploadFile;
}
最后是方法Create into ProgettiController:
public String create() {
try {
getFacade().create(current);
System.out.println("Message: ProgettiController: Create: new row created successfully!");
try {
current=getFacade().findLast();
String ext=uploadFile.getFileName();
System.out.println("Message: ProgettiController: Create: FileName="+ext);
ext=ext.substring(ext.lastIndexOf("."),ext.length());
System.out.println("Messaggio: ProgettiController: ext="+ext);
current.setNomeFile(ext.substring(0,ext.lastIndexOf(".")));
current.setTipoFile(ext.substring(ext.lastIndexOf(".")+1,ext.length()));
getFacade().edit(current);
ext=urlFilesystem+current.getId()+ext.substring(ext.lastIndexOf(".")+1,ext.length());
System.out.println("Message: ProgettiController: Create: posizione e nome del file="+ext);
File oldFile= (File)uploadFile;
File newFile= new File(ext);
oldFile.renameTo(newFile);
} catch (Exception e) {
System.out.println("Messaggio: ProgettiController: Create: errore nel try legato al upload="+e.getMessage());
e.printStackTrace();
}
JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("ProgettiCreated"));
recreateModel();
System.out.println("Messaggio: ProgettiController: create try");
return url+"List?faces-redirect=true";
} catch (Exception e) {
JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
System.out.println("Messaggio: ProgettiController: create catch="+e.getMessage());
e.printStackTrace();
return url+"List?faces-redirect=true";
}
}
如果我尝试这段代码,问题是当页面调用时方法返回null到uploadFile,如果我将“enctype =”multipart / form-data“”添加到h:form标签中,应用程序没有调用方法! 有人能帮我吗?非常感谢!
答案 0 :(得分:2)
如果我将“enctype =”multipart / form-data“”添加到h:form标签中,则应用程序不会调用该方法!
这意味着PrimeFaces文件上传过滤器无法正常工作。它负责解析multipart/form-data
请求并以可理解的形式将解析后的数据提供给JSF(直到即将推出的JSF 2.2版本,JSF默认不支持multipart/form-data
请求)。
至少可以有以下主要原因:
<servlet-name>
中的<filter-mapping>
不正确。您需要确保它与同一<servlet-name>
中<servlet>
的{{1}}配置完全相同FacesServlet
。
Commons IO和FileUpload JAR不在webapp的运行时类路径中。我不使用Netbeans,所以我不能详细介绍,但无论你使用什么方式将JAR包含在webapp中,你都需要确保它们最终位于部署的webapp的web.xml
文件夹中。您可以通过检查服务器中的部署来验证这一点。在Eclipse中,可以通过直接将这些JAR直接放在Web项目的文件夹中来实现。
您的网络应用程序中恰好有另一个/WEB-INF/lib
与PrimeFaces文件上传过滤器的工作大致相同,并且在 PrimeFaces文件上传过滤器之前执行。例如,捆绑在战斧中的MyFaces Filter
。请求体只能被解析一次。
答案 1 :(得分:1)
代码中出现错误导致空指针
{..
ext=ext.substring(ext.lastIndexOf("."),ext.length());
// here ext contains the extension of the file only
System.out.println("Messaggio: ProgettiController: ext="+ext);
current.setNomeFile(ext.substring(0,ext.lastIndexOf(".")));
// used the extension as the file name
current.setTipoFile(ext.substring(ext.lastIndexOf(".")+1,ext.length()));
// the file type is an empty string causing the error
..}
尝试以下
{..
ext=ext.substring(ext.lastIndexOf("."),ext.length());
System.out.println("Messaggio: ProgettiController: ext="+ext);
current.setNomeFile(uploadFile.getFileName().
substring(0,uploadFile.getFileName().lastIndexOf(".")));
// the file name is setted properly
current.setTipoFile(uploadFile.getFileName().
substring(uploadFile.getFileName().
lastIndexOf(".")+1,uploadFile.getFileName().length()));
// the file type is setted properly
..}