【问题标题】:org.apache.commons.fileupload.disk.DiskFileItem is not created properly?org.apache.commons.fileupload.disk.DiskFileItem 没有正确创建?
【发布时间】:2012-02-17 04:41:27
【问题描述】:

我正在尝试使用以下示例中显示的代码:

java.lang.NullPointerException while creating DiskFileItem

我的测试方法包含以下代码:

final File TEST_FILE = new File("C:/my_text.txt");
final DiskFileItem diskFileItem = new DiskFileItem("fileData", "text/plain", true, TEST_FILE.getName(), 100000000, TEST_FILE.getParentFile());
diskFileItem.getOutputStream();

System.out.println("diskFileItem.getString() = " + diskFileItem.getString());

该位置存在文本文件,但上述代码最后一行没有输出文件内容。

知道为什么吗?

注意

以下确实打印文件内容:

BufferedReader input =  new BufferedReader(new FileReader(TEST_FILE));
String line = null;
while (( line = input.readLine()) != null){
    System.out.println(line);
}

【问题讨论】:

    标签: java spring spring-mvc junit apache-commons


    【解决方案1】:

    在您的第一个代码片段中,您使用了 OutputStream,但它不起作用。在第二部分中,您使用 InputStream(或任何它的实现)并且它可以工作:) 您可能想尝试使用 getInputStream() 代替... OutputStream 是写入不读取的字节。

    http://commons.apache.org/fileupload/apidocs/org/apache/commons/fileupload/disk/DiskFileItem.html

    试试这个,它很简单,从头开始只是为了帮助:

    final File TEST_FILE = new File("D:/my_text.txt");
        //final DiskFileItem diskFileItem = new DiskFileItem("fileData", "text/plain", true, TEST_FILE.getName(), 100000000, TEST_FILE);
        try
        {
            DiskFileItem fileItem = (DiskFileItem) new DiskFileItemFactory().createItem("fileData", "text/plain", true, TEST_FILE.getName());
            InputStream input =  new FileInputStream(TEST_FILE);
            OutputStream os = fileItem.getOutputStream();
            int ret = input.read();
            while ( ret != -1 )
            {
                os.write(ret);
                ret = input.read();
            }
            os.flush();
            System.out.println("diskFileItem.getString() = " + fileItem.getString());
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    

    【讨论】:

    • 我想你错过了他们在我上面提到的链接中所说的话。他们打电话给diskFileItem.getOutputStream(); 只是为了绕过一些错误。但是 API 确实说 diskFileItem.getString()) 应该输出文件。无论如何,即使我使用BufferedReader input = new BufferedReader(new InputStreamReader(diskFileItem.getInputStream()));,它仍然不会输出文件。据我所知,这意味着diskFileItem 不包含文件内容。
    • 谢谢 - 它正在工作!我不知道他们为什么试图通过构造函数创建DiskFileItem。但是使用工厂肯定更有意义并且确实有效。
    • 我想没关系,只是你试图读出一个你刚刚创建的文件,但它仍然是空的。您必须先写入文件,然后才能读取它。请记住,它是用于存储来自请求的文件(如上传)而不是操作本地文件的对象。
    【解决方案2】:

    使用 apache IOUtils 的精简解决方案:

    final File TEST_FILE = new File("C:/my_text.txt");
    final DiskFileItem diskFileItem = new DiskFileItem("fileData", "text/plain", true, TEST_FILE.getName(), 100000000, TEST_FILE.getParentFile());
    
    InputStream input =  new FileInputStream(TEST_FILE);
    OutputStream os = diskFileItem.getOutputStream();
    IOUtils.copy(input, os);
    
    System.out.println("diskFileItem.getString() = " + diskFileItem.getString());
    

    【讨论】:

      猜你喜欢
      • 2017-07-22
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 2016-10-25
      • 2016-10-04
      • 1970-01-01
      相关资源
      最近更新 更多