私はここで、ファイルは移植性がなく、トランザクションであり、外部パラメーターを必要とするため、サーバーにファイルを保存するべきではないことを読みました。ただし、Tomcat(7)のtmpソリューションが必要であり、知りたいサーバーマシンを(相対的に)制御できることを考えると、次のようになります。
ファイルを保存するのに最適な場所はどこですか?保存する必要がありますか/WEB-INF/uploads
(ここではお勧めしません)、または下のどこかに保存する必要があります$CATALINA_BASE
(ここを参照)または...?JavaEE 6チュートリアルは、ユーザー(:wtf :)からパスを取得します。注意:ファイルは決してダウンロード可能であってはなりません。
ここで詳しく説明するように構成パラメーターを設定する必要がありますか?いくつかのコードをいただければ幸いです(相対パスを指定したいので、少なくともTomcatに移植可能です)-Part.write()
有望に見えますが、どうやら絶対パスが必要です
このアプローチとデータベース/ JCRリポジトリのデメリットの説明に興味があります。
残念ながら、@ BalusCによるFileServletはファイルのダウンロードに集中していますが、ファイルのアップロードに関する彼の回答は、ファイルの保存場所に関する部分をスキップしています。
DBまたはJCR実装(jackrabbitなど)を使用するように簡単に変換できるソリューションが望ましいでしょう。
アップロードされたイメージの回答に記載されている理由により、ページを更新した後にのみ利用できるため、IDEのプロジェクトフォルダー(サーバーのデプロイフォルダー)を除く、アクセス可能な場所に保存します。
IDEのプロジェクトフォルダでの変更は、サーバーの作業フォルダにすぐには反映されません。IDEには、サーバーの作業フォルダーが最後の更新と同期されるようにする一種のバックグラウンドジョブがあります(これは、「公開」と呼ばれるIDE用語です)。これが、発生している問題の主な原因です。
実際のコードでは、アップロードされたファイルをwebappのデプロイフォルダーに保存してもまったく機能しない場合があります。一部のサーバーは(デフォルトまたは構成によって)デプロイされたWARファイルをローカルディスクファイルシステムに展開せず、代わりに完全にメモリに展開します。基本的にデプロイされたWARファイルを編集して再デプロイしない限り、メモリ内に新しいファイルを作成することはできません。
サーバーがデプロイされたWARファイルをローカルディスクファイルシステムに展開した場合でも、新しく作成されたファイルはすべて、元のWARファイルの一部ではないため、再デプロイまたは単純な再起動で失われます。
メソッドを使用しないgetRealPath()
限り、ローカルディスクファイルシステムのどこに保存されるかは、私や他の誰にとっても重要ではありません。その方法を使用することは、いずれにせよ憂慮すべきことです。
保管場所へのパスは、さまざまな方法で定義できます。あなたはそれをすべて自分でしなければなりません。おそらくこれは、サーバーがすべて自動的にそれを行うことをどういうわけか期待していたために、混乱が引き起こされる場所です。最終的なアップロード先は指定されて@MultipartConfig(location)
いませんが、ケースファイルサイズの一時保存場所がメモリストレージのしきい値を超えていることに注意してください。
したがって、最終的な保管場所へのパスは、次のいずれかの方法で定義できます。
ハードコード:
File uploads = new File("/path/to/uploads");
経由の環境変数SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
サーバー起動時のVM引数-Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
次のようなファイルエントリupload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
名前upload.location
と値で/path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
存在する場合は、サーバーが提供する場所を使用します(JBoss AS / WildFlyなど)。
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
どちらの方法でも、次のようにファイルを簡単に参照して保存できます。
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
または、一意のファイル名を自動生成して、ユーザーが偶然に同じ名前の既存のファイルを上書きしないようにする場合:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
part
JSP /サーブレットで取得する方法は、JSP /サーブレットを使用してサーバーにファイルをアップロードする方法で回答されていますか?part
JSFで取得する方法は、JSF 2.2 <h:inputFile>を使用してファイルをアップロードする方法で回答されていますか?保存されたファイルはどこにありますか?
注:で定義された一時保管場所を基準にしたパスを解釈するため、使用しないでください。Part#write()
@MultipartConfig(location)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加