Grailsファイルのアップロードの問題
-
03-07-2019 - |
質問
私はgrails Webサイトからファイルアップロードコードをエミュレートしようとしていますが、いくつかの問題に直面しています。 こちらにあるのと同じコードを使用しています。ここに私のコードがあります:
<g:form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="myFile" />
<input type="submit" value="Upload" />
</g:form>
and
def upload = {
def f = request.getFile('myFile')
if(!f.empty) {
flash.message = 'success'
}
else {
flash.message = 'file cannot be empty'
}
}
実行時に次のエラーが表示されます:
Message: No signature of method: org.mortbay.jetty.Request.getFile() is applicable for argument types: (java.lang.String) values: {"myFile"}
Caused by: groovy.lang.MissingMethodException: No signature of method: org.mortbay.jetty.Request.getFile() is applicable for argument types: (java.lang.String) values: {"myFile"}
一部のSpring構成に関連しているようです。 Springは MultipartHttpServletRequest
を注入していないようです。そのため、私のリクエストには適切なメソッドがありません。 grails create-app
を使用してこのアプリケーションを作成しました。 resources.groovyファイルを変更していません。 grails 1.0.3を使用しています。
どんな助けも大歓迎です。 grailsのWebサイトでは、これがとても簡単に見えます。
解決
問題は解決しました!
Grailsにファイルをアップロードするためにサンプルコードを使用していたのは、おそらく元の作者が意図したものとは異なります。問題は、コントローラーの upload メソッドが呼び出されたときに、アップロードページの元のレンダリング用であることがあったということです。そのメソッドのリクエストは、MultipartHttpServletRequestタイプではありませんでした。アップロードするファイルでPOSTを実行すると、Springは正しい処理を行い、リクエストをMultipartHttpServletRequestに変更しました。そのため、MultipartHttpServletRequestのようなリクエストを使用する前に、 update コントローラーメソッドで簡単なチェックを行う必要がありました。
if(request instanceof MultipartHttpServletRequest)
{
MultipartHttpServletRequest mpr = (MultipartHttpServletRequest)request;
CommonsMultipartFile f = (CommonsMultipartFile) mpr.getFile("myFile");
if(!f.empty)
flash.message = 'success'
else
flash.message = 'file cannot be empty'
}
else
flash.message = 'request is not of type MultipartHttpServletRequest'
他のヒント
Grails 2.xでの使用:
<g:uploadForm name="upload" action="upload" method="POST">
<input type="file" name="file" />
</g:uploadForm>
def upload = {
def file = request.getFile('file')
assert file instanceof CommonsMultipartFile
if(!file.empty){ //do something }
else { //do something }
}
よりクリーンでシンプル。
html(アップロード元のフォームを含むgsp)を更新して、表示される enctype を設定します:
<g:form action="upload" method="post" enctype="multipart/form-data">
役立つことは明白すぎるように思えますが、エラーメッセージを見た後の最初の考えです。
誰かこちらは同じトラブルを抱えているようです。彼は「修正した」と言います。それ:
解決済み。それは私の間違いでした。フォームを送信する前に保存していたので、ファイルがなかったと思います。
彼が言ったことをどのようにとるかはわからないが、多分それはあなたを助けるだろう。