FileItem inputStream to FileInputStream

时间:2017-02-03 12:18:26

标签: java ajax

我有一个带有上传功能的网页,可让您上传excel文件,在点击上传时会触发Ajax调用。从那里我得到FileItem输入流并使用方法fileItem.getInputStream(),我有另一个类,我需要将文件传递给它,该方法有一个FileInputStream参数。所以我的问题是如何将输入流转换为FileInputStream

由于我是初级开发人员,所以我会感激详细的解决方案,所以我还在学习。

非常感谢。

2 个答案:

答案 0 :(得分:1)

来自JavaDoc

  

FileInputStream从文件系统中的文件获取输入字节。

我建议两种解决方案:

  1. 正确的方法是更改​​API并将InputStream作为参数。我没有看到您在API中FileInputStream的原因。
  2. 如果您不拥有API并且无法更改它,我担心您需要将InputStream保存到temp file,然后创建FileInputStream,并提供此文件的路径(当您首次将文件写入磁盘时,这是一个次优解决方案 - 冒出空间风险 - 然后读取它并且流API专为读取/写入数据而设计)

答案 1 :(得分:0)

如果您使用的是org.apache.commons.fileupload.FileItem接口,那么您的类可能是DefaultFileItem,它是DiskFileItem的子类。所以你可以将FileItem转换为DiskFileItem。然后,如果查看source code of DiskFileItem,您会发现getInputStream()实际上正在返回FileInputStream或ByteArrayInputStream如果从DiskFileItem获取FileInputStream,您可以将其直接传递给其他类。但是如果你得到一个ByteArrayInputStream,你必须将内容写入你自己的临时文件,然后在这个临时文件上打开另一个FileInputStream。还有另一种方法DiskFileItem.getStoreLocation(),它似乎返回服务器端用于上传的文件,但如果文件缓存在内存中,它可能返回null。

总之:您无法确定是否存在服务器端文件,因为上传可能会缓存在内存中。因此,如果您需要在其他地方使用FileInputStream,则必须通过创建临时文件来自己创建它。有一个关于如何在两个流here之间进行管道的示例。