2017-02-03 120 views
2

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

由于我是一名初级开发人员,因此我会感谢一个详细的解决方案,所以我仍然在学习。

非常感谢。

回答

1

JavaDoc

FileInputStream从在一个文件系统中的文件输入字节。

我建议两种解决方案:

  1. 正确的一个是改变API并具有InputStream作为参数。我没有看到你的API中有FileInputStream的原因。
  2. 如果您不拥有该API并且无法更改它,恐怕您需要将InputStream保存到temp file,然后创建FileInputStream,为此文件提供路径(这是您首次将文件写入的最佳解决方案磁盘 - 冒着出来的空间 - 然后读它,如果你正在使用org.apache.commons.fileupload.FileItem的接口,那么你的类可能是流API是专为在运行读/写数据)
+0

非常感谢。我拥有API,因此解决了我的问题。然而,我有另一个领先的问题,我传递给我的InputStream的API返回一个字符串,成功或错误。如果我上传了一个具有所有正确要求的文件,它会成功返回,然后如果我上传了另一个我知道会有错误的文件,它将返回一个错误,但在此之后,即使我上传了一个工作文件也不起作用我不断收到错误信息。看起来破碎的文件被存储并再次使用,而不管你之后传入的文件是什么。任何想法,为什么这可能是? – butYouDontLookLikeADeveloper

+0

我现在已经解决了这个问题。 – butYouDontLookLikeADeveloper

0

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

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

+0

谢谢你的回答。 – butYouDontLookLikeADeveloper