如何移动/重命名上传的文件?

时间:2012-02-05 21:36:55

标签: java jsf file-upload

我跟着this tutorial在我的JSF2应用程序中上传文件。 该应用程序工作正常,但我对一个方面不满意。 在重建请求时,通过请求发送的文件将保存在磁盘上的某个位置。

即使文件已保存,我还需要使用在输入包含操作方法的Managed Bean后可用的名称重命名该文件。

因此,我决定使用所需名称创建一个新文件,复制已保存的文件,然后删除不需要的文件。

private File uploadFile;
//...
try {
    BufferedWriter bw = new BufferedWriter(new FileWriter(newFile));
    BufferedReader br = new BufferedReader(new FileReader(uploadFile));

    String line = "";
    while ((line = br.readLine()) != null){
        bw.write(line);
    }
} catch (Exception e){}

新文件显示在所需位置,但是当我尝试打开文件时会抛出此错误:" PNG文件无效或不受支持"

这是我的问题:

  1. 有没有更好的方法来解决这个问题?
  2. 此解决方案是上传图片的最佳方式吗?是否有理由在业务逻辑之前保存文件,因为可能需要调整图片大小或者尚未提供所需的名称。
  3. LE 我也知道了this tutorial,但我只想尝试 mojarra

2 个答案:

答案 0 :(得分:3)

已经在java.io.File对象中内置了一个重命名方法,如果它对你的情况不起作用,我会感到惊讶。

public boolean renameTo(File dest)

    Renames the file denoted by this abstract pathname.

    Many aspects of the behavior of this method are inherently platform-dependent: 
    The rename operation might not be able to move a file from one filesystem to 
    another, it might not be atomic, and it might not succeed if a file with the
    destination abstract pathname already exists. The return value should always
    be checked to make sure that the rename operation was successful.

您还可以在保存之前检查文件是否存在,并且可以在执行初始保存之前使用ImageIO类对上载的文件进行验证。

答案 1 :(得分:2)

处理图像等二进制文件时,请勿使用ReaderWriter。使用流:FileInputStreamFileOutputStream。最好的变体是使用renameTo方法使用@Perception解决方案。

读者将文件读取为包含字符(例如txt,属性,yaml文件)。图像文件不是字符,它们是二进制文件,您必须使用流。