<h:inputFile/>
返回NullPointerException错误。我知道有很多关于这个异常和使用JSF上传文件的东西,但是我已经读完所有内容而没有成功诊断出这个问题。
我使用的是带有GlassFish 4.1.1的JSF 2.2,没有PrimeFaces或Tomahawk,因为你可以使用JSF 2.2处理文件上传。当我读到。
目标只是在远程文件系统上上传图片,并将路径复制到数据库以便稍后通过数据表检索。
我已经检查过:
1 - 我的表单具有enctype="multipart/form-data"
属性。
2 - 我的表单不是以另一种形式嵌套,尽管它是<ui:composition/>
的一部分。
3 - 我已设置所有适当的过滤器来处理multipart / form-data类型:
<filter>
<filter-name>MyFacesExtensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
4 - 当我在<h:inputFile/>
方法中删除create()
标记及其部分时,发送数据的工作没有任何问题。
5 - 我试图将ManagedBean声明为@ApplicationScoped
,@ViewScoped
和@RequestScoped
而不做任何更改。
6 - 我尝试使用抽象方法将初始化Part
属性放在ManagedBean中,但没有成功。
这是我的表格:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:t="http://myfaces.apache.org/tomahawk">
<h:form enctype="multipart/form-data">
<h:outputLabel value="Marque : " />
<h:inputText value="#{carController.car.brand}" />
<br/>
few same inputText
<h:outputLabel value="Photo : " />
<h:inputFile value="#{carController.picture}" required="true" requiredMessage="No file selected."/>
<br/>
<h:commandButton value="Valider" action="#{carController.create}" />
</h:form>
</ui:composition>
以下是我的ManagedBean,我已发表评论,因为这是处理我尝试过的图片上传的其他方式:
@Named(value = "carController")
@SessionScoped
public class CarController implements Serializable {
private static final long serialVersionUID = 1L;
@EJB
private CarFacade carFacade;
private Car car;
private Part picture;
private Collection<Car> carCollection;
public CarController() {car = new Car();}
public String create() throws IOException {
/*try ( InputStream inputStream = picture.getInputStream();
FileOutputStream outputStream = new FileOutputStream("D:" +
File.separator + "test" + File.separator +
picture.getSubmittedFileName())) {
int bytesRead = 0;
final byte[] chunck = new byte[1024];
while ((bytesRead = inputStream.read(chunck)) != -1) {
outputStream.write(chunck, 0, bytesRead);
}
}*/
/*Path folder = Paths.get("//resources//cars//");
String filename = FilenameUtils.getName(picture.getName());
String extension = FilenameUtils.getExtension(picture.getName());
Path file = Files.createTempFile(folder, filename + "-", "." + extension);
try (InputStream input = picture.getInputStream()) {
Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING);
}*/
picture.write("\\resources\\cars\\"+picture.getSubmittedFileName()+"."+picture.getContentType());
car.setPicturePath(picture.getSubmittedFileName());
carFacade.create(car);
return "/index.xhtml";
}
这是例外:
Caused by: java.lang.NullPointerException
at Controller.CarController.create(CarController.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.sun.el.parser.AstValue.invoke(AstValue.java:289)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
... 41 more
感谢您提供任何可能有用的建议。
编辑:
这是错误的原因:picture.write(&#34; \ resources \ cars \&#34; + picture.getSubmittedFileName()+&#34;。&#34; + picture.getC ontentType( ));
我试图将此添加到web.xml但没有成功:
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<multipart-config>
<location>\resources\cars\</location>
<max-file-size>1300000</max-file-size>
<max-request-size>20000000</max-request-size>
<file-size-threshold>50000</file-size-threshold>
</multipart-config>
</servlet>
答案 0 :(得分:0)
删除MyFacesExtensionsFilter
。只有在您使用<t:inputFileUpload>
代替<h:inputFile>
时,才需要这样做。