使用JSF2.2InputFile将文件写入磁盘

使用JSF2.2InputFile将文件写入磁盘,jsf,file-upload,file-io,jsf-2.2,Jsf,File Upload,File Io,Jsf 2.2,我正在尝试使用h:inputFile标记上传一个图像文件并将其写入磁盘 我的JSF代码: 我的ManagedBean: @Namedvalue=requestacoaomanagedbean @会议范围 @MultipartConfiglocation=/home/rogerio/tmp/ 公共类requisicatoamnagedbean实现可序列化{ 私人部分imagemCarregada; public void envirimagem引发IOException{ 试一试{ imagem

我正在尝试使用h:inputFile标记上传一个图像文件并将其写入磁盘

我的JSF代码:

我的ManagedBean:

@Namedvalue=requestacoaomanagedbean @会议范围 @MultipartConfiglocation=/home/rogerio/tmp/ 公共类requisicatoamnagedbean实现可序列化{ 私人部分imagemCarregada;

public void envirimagem引发IOException{ 试一试{ imagemCarregada.writeteste.jpg; }捕获ioe异常ioe{ System.out.printlnErro ao escrever:+ioe.getLocalizedMessage; } } } 据推测,该方法会将项上载到磁盘,并且不会抛出/捕获IOException。

注释应该放在实现HttpServlet的类上,而不是放在支持bean类上。基本上,该注释必须放在FacesServlet类上,这在JSF2.2之后就已经完成了

换句话说,您的支持bean类上的@MultipartConfig注释被忽略,并且没有任何效果,文件实际上没有保存在您在注释中指定的位置。相反,它被保存在相对于所谓的当前工作目录的路径中,该目录基本上是执行java.exe时当前打开的文件夹。对于JavaWeb应用程序,通常是服务器的二进制文件夹。您可以通过以下方式找到它:

System.out.println(new File(".").getAbsolutePath());
你会在那里看到你上传的文件

此外,即使@MultipartConfig注释起作用,location属性实际上并不表示永久文件上载保存位置。相反,它表示上载的文件大小超过可用/配置的内存空间时的临时磁盘存储位置。您不应将上载的文件永久存储在@MultipartConfiglocation标识的位置。您应该始终通过PartgetInputStream获取文件内容,并将其写入由表示绝对路径的新文件或路径提供的所需永久位置

去掉整个@MultipartConfig注释。它在支持bean类中没有做任何有用的事情。只需通过PartgetInputStream获取文件内容并将其复制到所需的绝对路径:

try (InputStream input = imagemCarregada.getInputStream()) {
    Files.copy(input, new File("/home/rogerio/tmp/teste.jpg").toPath());
}
另见 . 与具体问题无关,为此目的使用会话范围的bean并不理想。而是使用视图或请求范围的视图或请求。另请参见和,除了绑定到登录框架的登录表单之外,不建议在请求参数名称中使用prependId=false,因为登录框架不支持JSF prependId。另请参见。

注释应该放在实现HttpServlet的类上,而不是放在支持bean类上。基本上,该注释必须放在FacesServlet类上,这在JSF2.2之后就已经完成了

换句话说,您的支持bean类上的@MultipartConfig注释被忽略,并且没有任何效果,文件实际上没有保存在您在注释中指定的位置。相反,它被保存在相对于所谓的当前工作目录的路径中,该目录基本上是执行java.exe时当前打开的文件夹。对于JavaWeb应用程序,通常是服务器的二进制文件夹。您可以通过以下方式找到它:

System.out.println(new File(".").getAbsolutePath());
你会在那里看到你上传的文件

此外,即使@MultipartConfig注释起作用,location属性实际上并不表示永久文件上载保存位置。相反,它表示上载的文件大小超过可用/配置的内存空间时的临时磁盘存储位置。您不应将上载的文件永久存储在@MultipartConfiglocation标识的位置。您应该始终通过PartgetInputStream获取文件内容,并将其写入由表示绝对路径的新文件或路径提供的所需永久位置

去掉整个@MultipartConfig注释。它在支持bean类中没有做任何有用的事情。只需通过PartgetInputStream获取文件内容并将其复制到所需的绝对路径:

try (InputStream input = imagemCarregada.getInputStream()) {
    Files.copy(input, new File("/home/rogerio/tmp/teste.jpg").toPath());
}
另见 .
与具体问题无关,为此目的使用会话范围的bean并不理想。而是使用视图或请求范围的视图或请求。另请参见和,除了绑定到登录框架的登录表单之外,不建议在请求参数名称中使用prependId=false,因为登录框架不支持JSF prependId。另请参见。

那么有些东西不起作用了吗?是的。该文件未写入磁盘。因此,是否有问题?是的。文件未写入磁盘。您应该始终通过Partwrite>>将其写入所需的永久位置。您是说Pathwrite吗?@Mr_and_Mrs_D:不,Part是。关于您当前的问题,请参阅我的。我猜是这样的:fileName-流将写入的文件的名称。该文件是相对于文件的MultipartConfig中指定的位置创建的
anks@BalusC。现在我已经意识到write方法将文件放在哪个目录中,但即使指定绝对路径,它也不起作用。引发异常:java.io.FileNotFoundException:/srv/glassfish-4.0/glassfish/domains/domain1/generated/jsp/identidadeWeb-war/home/rogerio/teste.jpg。我会尝试另一种方法。@rogerio\u gentil:glassfish部分不支持绝对文件路径。显然,写:你应该总是通过Partwrite>>将它写到所需的永久位置。你是说Pathwrite吗?@Mr\u and\u Mrs\u D:不,部分是。关于您当前的问题,请参阅我的。我猜是这样的:fileName-流将写入的文件的名称。该文件是相对于MultipartConfig中指定的位置从manks@BalusC创建的。现在我已经意识到write方法将文件放在哪个目录中,但即使指定绝对路径,它也不起作用。引发异常:java.io.FileNotFoundException:/srv/glassfish-4.0/glassfish/domains/domain1/generated/jsp/identidadeWeb-war/home/rogerio/teste.jpg。我会尝试另一种方法。@rogerio_gentil:glassfish部分不支持绝对文件路径。显然,请编写:请参阅