web-dev-qa-db-ja.com

アップロードされた画像は、ページを更新した後にのみ利用可能です

写真をアップロードすると、ファイルが正常に保存され、パスが正常に設定されます。ただし、アップロードされた画像は、フォームの送信直後には表示されません。ページをリロードしたときのみ、アップロードした画像が表示されます。

アップロードしたファイルを以下のように保存しています。

InputStream is;
try {
    File file = new File("C:\\****\\*****\\Documents\\NetBeansProjects\\EventsCalendary\\web\\resources\\images\\uploadPhoto.png");
    is = event.getFile().getInputstream();
    OutputStream os = new FileOutputStream(file);
    setUserPhoto("\\EventsCalendary\\resources\\images\\"+file.getName());   
    byte buf[] = new byte[1024];
    int len;
    while ((len = is.read(buf)) > 0) {
        os.write(buf, 0, len);
    }
    os.close();
    is.close();

} catch (IOException ex) {
    System.out.println(ex.getStackTrace());
}

アップロードされた画像がページをリロードした後にのみ表示されるのはなぜですか?これを解決するにはどうすればよいですか?

19

ファイルをIDEのプロジェクトフォルダーに直接書き込んでいて、意図的にファイルをwebappのデプロイフォルダーに保存しているようです。これは悪い考えであり、次の3つの主な理由が原因です。

  1. IDEのプロジェクトフォルダでの変更は、サーバーの作業フォルダにすぐには反映されません。 IDEには、サーバーの作業フォルダーが最後の更新と同期されるようにする一種のバックグラウンドジョブがあります(これはIDE「公開」と呼ばれる用語にあります) )これがあなたが見ている問題の主な原因です。

  2. 実際のコードでは、アップロードされたファイルをwebappのデプロイフォルダーに保存してもまったく機能しない場合があります。一部のサーバーは(デフォルトまたは構成によって)デプロイされたWARファイルをローカルディスクファイルシステムに展開せず、代わりに完全にメモリに展開します。基本的にデプロイされたWARファイルを編集して再デプロイしない限り、メモリ内に新しいファイルを作成することはできません。

  3. サーバーがデプロイされたWARファイルをローカルディスクファイルシステムに展開した場合でも、新しく作成されたすべてのファイルは、元のWARファイルの一部ではないため、再デプロイまたは単純な再起動で失われます。

代わりに、project/deployフォルダーの外部の固定パスに書き込む必要があります。たとえば、/var/webapp/uploadsです。次に、それをWebアプリで提供できるようにするには、新しいWebアプリケーションコンテキストとしてサーバーに追加するだけです。

以前の質問に基づいて、Glassfish3.1を使用していることを知っています。このサーバーでは、「仮想ホスト」と呼ばれます。管理コンソールのサーバーレベルで構成できます http:// localhost:4848>構成> HTTPサービス>仮想サーバー、または次の行を/WEB-INF/glassfish-web.xmlに追加してwebappレベルで(IDEは自動生成されているはずです。このファイルはGlassfish3.1より前のSun-web.xmlであることに注意してください。 、それで、それを参照しているマニュアル/ブログ/チュートリアルを見ているなら、はい、それはまったく同じファイルです):

<property name="alternatedocroot_1" value="from=/uploads/* dir=/var/webapp" />

いずれの場合も、 http:// localhost:8080/contextname/uploads / *を使用して、アップロードされた画像を<img>から通常の方法で提供できるようになります。

参照:

41
BalusC