難産
TeedaでMyFacesのtomahawkを使用してファイルのアップロードを実装しようとしているが、うまくいかない。
http://localhost:8080/examples/view/accept/accept.html を呼び出すと、コンソールに以下のログが表示される。
: DEBUG 2007-02-02 10:02:27,809 [http-8080-Processor25] クラス(examples.web.accept.AcceptPage[accept_acceptPage])のコンポーネント定義を登録します WARN 2007-02-02 10:02:27,889 [http-8080-Processor25] examples.web.accept.AcceptPage$$EnhancedByS2AOP$$190ed52のプロパティ(uploadedFile)が見つからないので設定をスキップします :
適当なファイルをアップロードしたが、doUploadメソッドにブレークポイントを貼って、uploadedFileを確認したが、nullになっている。setUploadedFile(UploadedFile)が呼ばれていないためである。
なぜ、setUploadedFileメソッドが呼ばれないのか分からない。現在、原因を調査中。
- Dolteng 0.16.1 で Teeda + S2Dao のプロジェクトexamplesを作成。
- WEB-INFにtomahawk 1.1.1のjarとcommons-fileupload-1.1.1.jarをコピーし、ビルドパスに登録。
- web.xmlに拡張フィルタを追加
: <filter> <filter-name>extensionsFilter</filter-name> <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class> <init-param> <param-name>uploadMaxFileSize</param-name> <param-value>100m</param-value> <description>Set the size limit for uploaded files. Format: 10 - 10 bytes 10k - 10 KB 10m - 10 MB 1g - 1 GB </description> </init-param> <init-param> <param-name>uploadThresholdSize</param-name> <param-value>100m</param-value> <description>Set the thrshold size -files below this limit are stored in memory, files above this limit are stored on disk. Format: 10 - 10 bytes 10k - 10 KB 10m - 10 MB 1g - 1 GB </description> </init-param> <init-param> <param-name>uploadRepositoryPath</param-name> <param-value>/work</param-value> <description>Set the path where the intermediary files will be stored.</description> </init-param> </filter> : <filter-mapping> <filter-name>extensionsFilter</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping>
- accept.htmlをsrc/main/webapp/view/acceptに作成。
: <body> <form enctype="multipart/form-data"> <x:inputFileUpload id="uploadedFile" value="#{accept_acceptPage.uploadedFile}"/> <input type="submit" id="doUpload" value="UPLOAD"/> </form> </body> :
package examples.web.accept; import java.io.Serializable; import org.apache.myfaces.custom.fileupload.UploadedFile; public class AcceptPage implements Serializable{ /** * */ private static final long serialVersionUID = 1L; /** * アップロードファイル */ private UploadedFile uploadedFile; /** * アップロードファイルを取得する * @return アップロードファイル */ public UploadedFile getUploadedFile() { return uploadedFile; } /** * アップロードファイルを設定する * @param uploadedFile アップロードファイル */ public void setUploadedFile(UploadedFile uploadedFile) { //このメソッドが呼ばれない this.uploadedFile = uploadedFile; System.out.println("uploadFileSize[" + uploadedFile.getSize() + "]"); System.out.println("uploadFileName[" + uploadedFile.getName() + "]"); } /** * アップロードがクリックされたときの処理 * @return */ public String doUpload() { //setUploadedFileが呼ばれないため、uploadedFileがnullである。 if(uploadedFile != null){ System.out.println("file size [" + uploadedFile.getSize() + "]"); } return null; } public String initialize() { return null; } public String prerender() { return null; } }
AcceptPageクラスのuploadedFileとaccept.htmlのuploadedFileは関連付けられているはずである。というのは、お互いのソースエディターの左端に双方向矢印が表示されていて、DoltengでOpen Pair Pageをすると、お互いの行に移動するためである。
大谷さんのブログにあるサンプルを参考に、また、訪問者という方が同じ状況に遭われていたようですが、filter-mappingを設定していなかったために出ていたようでした。当方は、filter-mappingの設定は行っているにもかかわらず、同様の現象が発生しています。
setUploadedFileが呼ばれないということはaccept.htmlとAcceptPageクラスのuploadedFileに実際は関連付けられていないためだと思われます。その辺から原因を突き止めると、解決していくような気がする。
teedaではなく、S2JSFではあるが、wataka日記でアップロードできないという現象に出くわしたとある。もっともこれは単純ミス(内容は不明)だったようだ。
あと、しままる@はてなにも同じくS2JSFでまったく同じような現象に出くわしているようだが、Teeda coreを最新のものにしたら動くようになったということだ。しかし、このブログは2006/07/20のもので、teedaがβ2だったようで、こちらはteeda-1.0.3なので、直っているはずである。
ちなみに再現環境は以下のとおりである。