我有一个带有上传功能的网页,可让您上传excel文件,在点击上传时会触发Ajax调用。从那里我得到FileItem
输入流并使用方法fileItem.getInputStream()
,我有另一个类,我需要将文件传递给它,该方法有一个FileInputStream
参数。所以我的问题是如何将输入流转换为FileInputStream
?
由于我是初级开发人员,所以我会感激详细的解决方案,所以我还在学习。
非常感谢。
答案 0 :(得分:1)
来自JavaDoc
FileInputStream从文件系统中的文件获取输入字节。
我建议两种解决方案:
InputStream
作为参数。我没有看到您在API中FileInputStream
的原因。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之间进行管道的示例。