8

grails Web サイトからファイル アップロード コードをエミュレートしようとしていますが、いくつかの問題が発生しています。hereと同じコードを使用しています。これが私のコードです:

    <g:form action="upload" method="post" enctype="multipart/form-data">
        <input type="file" name="myFile" />
        <input type="submit" value="Upload" />
    </g:form>

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 は injecting していないように見えるMultipartHttpServletRequestため、私のリクエストには適切なメソッドがありません。を使用してこのアプリケーションを作成しましgrails create-appた。resources.groovy ファイルは変更していません。私はgrails 1.0.3を使用しています。

どんな助けでも大歓迎です。grails の Web サイトでは、このように簡単に表示できます。

4

4 に答える 4

12

問題が解決しました!

ファイルを Grails にアップロードするためのサンプル コードを、元の作成者がおそらく意図したものとは異なる方法で使用していました。問題は、コントローラーのアップロードメソッドが呼び出されたときに、アップロード ページの元のレンダリング用であることがあったことです。そのメソッドのリクエストは、MultipartHttpServletRequest タイプではありませんでした。アップロードするファイルで POST を実行すると、Spring は正しいことを行い、リクエストを MultipartHttpServletRequest に変更しました。そのため、MultipartHttpServletRequest などのリクエストを使用する前に、更新コントローラー メソッドで簡単なチェックを行う必要がありました。

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'
于 2008-10-15T21:11:42.720 に答える
5

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 }
}

よりクリーンに、よりシンプルに。

于 2013-06-14T13:15:20.280 に答える
4

html (アップロード元のフォームを含む gsp) を更新して、enctypeが表示されるようにしてください。

<g:form action="upload" method="post" enctype="multipart/form-data">

それが役に立てば幸いです。あまりにも明白に思えますが、エラーメッセージを見た後の最初の考えです。

于 2008-10-15T20:19:31.483 に答える
2

あなたと同じように悩んでいる人がここにいるようです。彼はそれを「修正した」と言います:

解決しました。私のミスで、フォームを送信する前にアクション セーブを行っていたので、ファイルがなかったと思います。

彼の言ったことをどう受け止めていいのかわからないが、きっと役に立つだろう。

于 2008-10-15T20:38:05.940 に答える