1

私は多くのページを読みましたが、確かに、どこかでいくつかのエラーを起こし、ファイルのアップロードを単純に行うことができません。

まず、私は Netbeans 7 と JDK 1.7 を搭載した Glassfish 3.1 で JSF2.0、Primefaces 3.2、および JPA2 を使用して開発しています。

次に言わなければならないことは、他の多くのクラスから拡張され、ファイルシステムの多くのフォルダーにファイルを格納するインターフェイスにこのコードを挿入しようとしていることです! それでは、私が書いたことを報告し、どこに問題があるのか​​教えてください!

これは、web.xml へのコードです。

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    <init-param>
        <param-name>uploadDirectory</param-name>
        <param-value>D:/Cyborg/</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>  

p:uploadFile を含むページには、他の多くのフォームのフィールドも含まれています。興味があると思われるものだけをコピーします。

...
<h:form method="POST">
    ...
    <h:outputLabel for="uploadFile" value="#{bundle.LabelUploadFile}" />
    <p:fileUpload value="#{progettiController.uploadFile}" mode="simple" />
    ...
    <h:commandLink action="#{progettiController.create}" value="#{bundle.SaveLink}" />
    ...

これは、AbstractController と呼ばれるインターフェイスへのコードです。

protected UploadedFile uploadFile;

public void setUploadFile(UploadedFile uploadFile) {
    this.uploadFile=uploadFile;
}

public UploadedFile getUploadFile() {
    return uploadFile;
}

そして最後にメソッド Create into ProgettiController:

public String create() {
    try {
        getFacade().create(current);
        System.out.println("Message: ProgettiController: Create: new row created successfully!");

        try {
            current=getFacade().findLast();
            String ext=uploadFile.getFileName();
            System.out.println("Message: ProgettiController: Create: FileName="+ext);

            ext=ext.substring(ext.lastIndexOf("."),ext.length());
            System.out.println("Messaggio: ProgettiController: ext="+ext);

            current.setNomeFile(ext.substring(0,ext.lastIndexOf(".")));
            current.setTipoFile(ext.substring(ext.lastIndexOf(".")+1,ext.length()));
            getFacade().edit(current);
            ext=urlFilesystem+current.getId()+ext.substring(ext.lastIndexOf(".")+1,ext.length());
            System.out.println("Message: ProgettiController: Create: posizione e nome del file="+ext);

            File oldFile= (File)uploadFile;
            File newFile= new File(ext);
            oldFile.renameTo(newFile);
        } catch (Exception e) {
            System.out.println("Messaggio: ProgettiController: Create: errore nel try legato al upload="+e.getMessage());
            e.printStackTrace();
        }

        JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("ProgettiCreated"));
        recreateModel();
        System.out.println("Messaggio: ProgettiController: create try");
        return url+"List?faces-redirect=true";
    } catch (Exception e) {
        JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        System.out.println("Messaggio: ProgettiController: create catch="+e.getMessage());
        e.printStackTrace();
        return url+"List?faces-redirect=true";
    }
}

このコードを試してみると、ページ呼び出しでメソッドが null を uploadFile に返すときに、"enctype="multipart/form-data"" を h:form タグに追加すると、アプリケーションがメソッドを呼び出さなかったという問題が発生します。誰かが私を助けることができますか?どうもありがとう!

4

2 に答える 2

2

「enctype="multipart/form-data"」を h:form タグに追加すると、アプリケーションはメソッドを呼び出しませんでした!

これは、PrimeFaces ファイル アップロード フィルタが適切に機能していなかったことを意味します。multipart/form-dataリクエストを解析し、解析されたデータを理解可能な形式で JSF にさらに提供する役割を担います(今後の JSF 2.2 バージョンまで、JSF はデフォルトでmultipart/form-dataリクエストをサポートしません)。

これには、少なくとも次の主な理由が考えられます。

  • <servlet-name><filter-mapping>正しくありません。<servlet-name>同じの<servlet>構成とまったくFacesServlet同じであることを確認する必要がありますweb.xml

  • Commons IO および FileUpload JAR は、Web アプリケーションのランタイム クラスパスにありません。私は Netbeans を使用していないため、詳しく説明することはできませんが、Web アプリケーションに JAR を含めるために使用する方法が何であれ、それらがデプロイされた Web アプリケーションのフォルダーに確実に収まるようにする必要があり/WEB-INF/libます。サーバーでデプロイを確認することで確認できます。Eclipse では、これらの JAR を Web プロジェクトのそのフォルダーに直接ドロップするだけで実現できます。

  • FilterPrimeFaces ファイル アップロード フィルタとほぼ同じジョブを実行し、PrimeFaces ファイル アップロード フィルタのに実行される別の Web アプリケーションがたまたまあるとします。たとえば、ExtensionsFilterTomahawk にバンドルされている MyFaces です。つまり、リクエストボディは一度だけ解析できます。

于 2012-04-18T13:11:00.430 に答える
1

コードにエラーがあり、null ポインターが発生している

        {..
        ext=ext.substring(ext.lastIndexOf("."),ext.length()); 
        // here ext contains the extension of the file only

        System.out.println("Messaggio: ProgettiController: ext="+ext);

        current.setNomeFile(ext.substring(0,ext.lastIndexOf(".")));
        // used the extension as the file name
        current.setTipoFile(ext.substring(ext.lastIndexOf(".")+1,ext.length()));
        // the file type is an empty string causing the error
        ..}

以下を試してください

        {..
        ext=ext.substring(ext.lastIndexOf("."),ext.length()); 

        System.out.println("Messaggio: ProgettiController: ext="+ext);

       current.setNomeFile(uploadFile.getFileName().
                           substring(0,uploadFile.getFileName().lastIndexOf(".")));
        // the file name is setted properly
        current.setTipoFile(uploadFile.getFileName().
                           substring(uploadFile.getFileName().
                           lastIndexOf(".")+1,uploadFile.getFileName().length()));
        // the file type is setted properly
        ..}
于 2013-11-04T23:45:36.050 に答える