1

h:inputFile タグを使用して画像ファイルをアップロードし、ディスクに書き込もうとしています。

私のJSFコード:

<h:form id="fileUploadForm" enctype='multipart/form-data' prependId="false">
   <h:inputFile value="#{solicitacaoManagedBean.imagemCarregada}" />
   <br />
   <h:commandButton styleClass="btn btn-primary " value="Enviar" action="#{solicitacaoManagedBean.enviarImagem}" />
</h:form>

私のマネージドBean:

@Named(value = "solicitacaoManagedBean")
@SessionScoped
@MultipartConfig(location = "/home/rogerio/tmp/")
public class SolicitacaoManagedBean implements Serializable {

   private Part imagemCarregada;

(...)

   public void enviarImagem() throws IOException {
      try {
         imagemCarregada.write("teste.jpg");
      } catch (IOException ioe) {
         System.out.println("Erro ao escrever: " + ioe.getLocalizedMessage());
      }
   }
}

おそらく、メソッド書き込みはアイテムをディスクにアップロードし、IOExceptionもスロー/キャッチされません。

4

1 に答える 1

8

@javax.servlet.annotation.MultipartConfig注釈は、バッキング Bean クラスではなく、 を実装するクラスに配置する必要がありますHttpServlet。基本的に、そのアノテーションはFacesServletクラスに配置する必要がありますが、これは JSF 2.2 以降で既に行われています。

つまり、@MultipartConfigバッキング Bean クラスの注釈は無視されて効果がなく、ファイルは注釈で指定した場所に実際には保存されませんlocation。代わりに、いわゆる現在の作業ディレクトリjava.exeへの相対パスに保存されています。これは基本的に、実行された時点で「現在開いているフォルダー」です。通常、サーバーのバイナリフォルダーなどであるJava Webアプリケーションの場合。以下のように追跡できます。

System.out.println(new File(".").getAbsolutePath());

そこにアップロードしたファイルが表示されます。

さらに、@MultipartConfigアノテーションが機能したとしても、location属性は実際には永続的なファイル アップロードの保存場所を表していません。代わりに、アップロードされたファイルのサイズが使用可能な/構成されたメモリ領域を超えた場合の一時的なディスク ストレージの場所を表します。で識別される場所に、アップロードしたファイルを永続的に保存しないでください@MultipartConfig(location)。常にファイルの内容を取得し、新しいパスまたは絶対パスを表すPart#getInputStream()目的の永続的な場所に書き込む必要があります。FilePath

@MultipartConfigその注釈全体を取り除きます。バッキング Bean クラスでは何も役に立ちません。ファイルの内容を取得しPart#getInputStream()て、目的の絶対パスにコピーするだけです。

try (InputStream input = imagemCarregada.getInputStream()) {
    Files.copy(input, new File("/home/rogerio/tmp/teste.jpg").toPath());
}

こちらもご覧ください


具体的な問題とは関係ありませんが、この目的でセッション スコープ Bean を使用することは理想的ではありません。むしろビューまたはリクエストスコープのものを使用してください。適切な Bean スコープを選択する方法も参照してください。また、prependId="false"リクエスト パラメータ名で JSF プリペンド ID をサポートしないログイン フレームワークに関連付けられたログイン フォーム以外の目的での使用は推奨されません。prependId="false" が <f:ajax render> を壊す UIFormも参照してください。

于 2013-08-30T13:13:57.510 に答える