質問

私は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">

役立つことは明白すぎるように思えますが、エラーメッセージを見た後の最初の考えです。

誰かこちらは同じトラブルを抱えているようです。彼は「修正した」と言います。それ:

  

解決済み。それは私の間違いでした。フォームを送信する前に保存していたので、ファイルがなかったと思います。

彼が言ったことをどのようにとるかはわからないが、多分それはあなたを助けるだろう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top