2017-02-03 124 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