0

我使用以下方法通过primefaces上传器保存图片:

public void carregarArquivo(FileUploadEvent event)
        throws FileNotFoundException, IOException {
    InputStream input = event.getFile().getInputstream();
    ServletContext servletContext = (ServletContext) FacesContext
            .getCurrentInstance().getExternalContext().getContext();
    File arquivo = new File(servletContext.getRealPath("") + File.separator
            + "images" + File.separator + "tmp" + File.separator
            + numMatricula + ".png");
    OutputStream output = null;
    try {
        output = new FileOutputStream(arquivo);
        IOUtils.copy(input, output);
        System.out.println("Arquivo salvo com sucesso em "
                + arquivo.getAbsolutePath());
        tmpFotoPath = "/images/tmp/" + numMatricula + ".png";
        IOUtils.copy(input, output);
        System.out.println("Arquivo salvo com sucesso em "
                + arquivo.getAbsolutePath());
        tmpFotoPath = "/images/tmp/" + numMatricula + ".png";
    } finally {
        IOUtils.closeQuietly(output);
        IOUtils.closeQuietly(input);
    }
}

将标准 eclipse web 项目部署到 JBoss AS 7.1.1 时,该方法正常工作,并将图像保存到 /home/hfluz/Servers/standalone 7.1.1/standalone/deployments/IdentificacaoInstitucional.war/images/tmp/

所以我创建了一个 maven webapp 并实现了相同的类和 xhtml 页面(也是相同的 web.xml)。默认情况下,JBoss AS maven 插件将我的应用程序部署到另一个文件夹,当它尝试使用 File 作为参数创建 FileOutputStream 实例时(输出 = new FileOutputStream(arquivo);)我收到以下错误:

/home/hfluz/Servers/standalone 7.1.1/standalone/tmp/vfs/temp3081e1eb97c799e8/content-b5984e02f5b23513/images/tmp/200701500694.png(没有这样的文件或目录)

Windows 7 和 Ubuntu 12.04 都会出现此问题。

这是一个错误还是我做错了什么?

编辑: 我想我发现了问题。

当我部署 ant webapp 时,会创建以下结构: - identificacao_institucional.war - WEB-INF - META-INF - images - tmp - index.xhtml

当我部署 maven webapp 时,这是在 JBoss 部署文件夹中创建的结构: - identificacao_institucional.war - META-INF - 资源 - WEB-INF - index.xhtml

由于某种原因,maven 应用程序不会创建图像目录及其子目录。我认为在调用“new FileOutputStream(arquivo);”之前可能会调用“arquivo.mkdirs()”和“arquivo.createNewFile()”。会解决这个问题,但它没有。

4

2 回答 2

0

WAR 通过虚拟文件系统公开。它正在读取本质上是压缩文件的 WAR 的内容。java.io.File没有虚拟文件系统的概念。

它在 Eclipse 中工作的原因是它被部署为爆炸部署。这意味着它只是一个未压缩的普通文件结构。

您可以使用简单的服务和图像的爆炸 WAR 部署,然后写入该目录。也可能有更好的方法来提供这样的静态内容。我只是没有调查过。

于 2013-06-18T19:24:15.563 回答
0

我解决了这个问题。这实际上是我的错。

我非常专注于比较两个项目之间的 java 和 xhtml 代码,以至于我没有意识到我忘记在 maven 项目中创建图像文件夹。

在通过 jboss 作为 maven 插件部署的情况下,不包括空目录,因此我添加了虚拟文件(记录文件夹用途)以在 maven 部署到 tmp/vfs 期间包含它们。

詹姆斯,谢谢你的耐心。

于 2013-06-19T22:36:34.217 回答