2017-02-03 10 views
2

私はアップロード機能を備えたWebページを持っています。これを使ってExcelファイルをアップロードできます。アップロードを押すとAjaxコールが起動します。そこから私はFileItem入力ストリームを取得し、メソッドfileItem.getInputStream()を使用して、FileInputStreamパラメータを持つファイルを渡す必要のあるメソッドを持つ別のクラスを持っています。ですから私の質問は、入力ストリームをFileInputStreamに変換する方法です。FileItem inputStream to FileInputStream

私がジュニア開発者であるため詳細な解決策が得られるので、まだ学習中です。

多くのありがとうございます。

答えて

1

JavaDocからAのFileInputStreamは、ファイルシステム内のファイルからのバイトの入力データを取得します。

私は2つのソリューションをお勧めします:

  1. 適切なものは、APIを変更するには、パラメータとしてInputStreamを持つことです。あなたのAPIにはFileInputStreamという理由がありません。
  2. APIを所有していない場合でも変更できない場合は、InputStreamtemp fileに保存してから、FileInputStreamを作成してこのファイルへのパスを作成する必要があります。ディスク - 宇宙の外に危険にさらして - と、それを読んで、あなたはorg.apache.commons.fileupload.FileItemインターフェイスを使用している場合は、あなたのクラスはおそらくストリーミングAPIはオンザフライでの読み取り/書き込み)
+0

ありがとうございました。私はAPIを所有しているので、問題は解決しました。私は別の問題をリードしていますが、私が渡しているAPIは、成功またはエラーの文字列を返すInputStreamです。私はすべての正しい要件を持っているファイルをアップロードした場合、それは成功して戻ってきます。そして、私が知っている別のファイルをアップロードするとエラーが返されますが、それはエラーを返します。もう私はエラーメッセージが表示され続けます。それは、破損したファイルが格納され、後でそれを渡すファイルに関係なく、再び使用されるようです。それがどうしてあろうと思う? – butYouDontLookLikeADeveloper

+0

私は今この問題を修正しました。 – butYouDontLookLikeADeveloper

0

のために設計されていますDefaultFileItemはDiskFileItemのサブクラスです。したがって、FileItemをDiskFileItemにキャストすることができます。 source code of DiskFileItemを見ると、getInputStream()が実際にFileInputStreamまたはByteArrayInputStreamを返すことがわかります。DiskFileItemからFileInputStreamを取得した場合は、他のクラスに直接渡すことができます。しかし、ByteArrayInputStreamを取得した場合は、自分のテンポラリファイルに内容を書き込んだ後、この一時ファイルで別のFileInputStreamを開く必要があります。アップロードに使用されるサーバー側のFileを返すようなDiskFileItem.getStoreLocation()メソッドもありますが、ファイルがメモリにキャッシュされている場合はnullが返される可能性があります。

結論:アップロードがメモリにキャッシュされる可能性があるため、サーバーサイドファイルが存在することは確かではありません。したがって、FileInputStreamが必要な場合は、一時ファイルを作成してFileInputStreamを自分で作成する必要があります。 2つのストリームの間でパイプする方法の例がありますhere

+0

ありがとうございました。 – butYouDontLookLikeADeveloper

関連する問題