1

byte[]Grails 2.2.3 を使用してとして定義された列に jpeg ファイル (3 ~ 8 KB) をロードしようとすると、キャプション付きの例外が発生します。エラーは次のとおりです。

org.h2.jdbc.JdbcSQLException: Value too long for column "PHOTO BINARY(255) ... SQL statement: update profile set col1=?, ..., photo=?, ..., coln=? where id=?

これは Grails 1.3.7 では org.hsqldb.jdbcDriver を使用して動作していましたが、現在は常に失敗しています。変数を別の方法で定義する必要がありますか? もしそうなら、何ですか?

すべてのbyte[] photoコードを に変更しようとしましbyte[] photo = new byte[10000]たが、まったく役に立ちませんでした。


与えられた回答に応じて、元の質問に追加します。初めまして、皆様ありがとうございます。これは、DataSource.groovy 内の関連するコードです。

environment {
  developement {
    dataSource {
      dbCreate = "update"
      url = "jdbc:h2:file:devDb:MVCC=TRUE;LOCK_TIMEOUT=10000
    }
  }
}

次のファイルとコードは、ImageController.groovy からイメージが読み込まれていると思われる場所です。

class PhotoUploadCommand {
  byte[] photo
  //def photo      // tried, makes no diff here
  String userId
  static constraints = { photo(maxSize: 1024 * 1024) }  // added as per suggestions
}
class ImageController {
  def imageService
  def upload = { PhotoUploadCommand puc ->
    def user = User.findByUserId(puc.userId)
    user.profile.photo = puc.photo
    //user.profile.photo = request.getFile('photo')  // also tried - N/G
    redirect(controller: 'user', action: 'profile', id: puc.userId)
}

class ImageController {クロージングで始まりクロージングで終わるすべてのコードをコメントアウトしても、}違いはありません。したがって、私は間違っているに違いありません。これは、画像が読み込まれている場所ではありません。ただし、このアプリケーション全体には、写真の読み込みに直接関連する他のコードはありません。したがって、これは Profile.groovy クラスからスキャフォールディングする必要があります。

class Profile {
  byte[] photo
  //def photo  // tried, but then the element is removed from the template
  String fullName
  String bio
  String homepage
  String email
  String timezone
  String country
  String jabberAddress
  String skin

  static mapping = {
    photo column: 'photo', sqlType: 'VARBINARY(10000)', nullable: 'true'
    //photo(type: 'image')  // also tried
  }

  static constraints = {
    fullName(nullable: true)
    // ... 
    //photo(nullable: true, maxSize: 1024 * 1024)  // also tried
    photo(nullable: true)
    // ... 
  }

これらすべての同じ列を含む UserContoller.class もあり、さらに:

String userId
String password
String passwordRepeat

...そしてそこに変更byte[] photoしてdef photoも何もしません-マッピングを追加することもありません。Java プログラマーにとって非常に紛らわしいです。

4

4 に答える 4

4

constraintsまたはmappingクロージャーのいずれかを使用して、休止状態の列の型に影響を与えることができます。

制約の使用

Grails はmaxSizeorsize制約を調べて、必要な列のサイズを通知します。

static constraints = {
    photo maxSize: 10000
}

列定義の使用

Grails では、マッピング クロージャで sql データ型を指定できます。これらは DB ベンダーに固有のものである可能性がありますが、制約ヒントが DB スキーマに一致するほど柔軟でない場合をカバーします。たとえば、postgres bytea カラムを使用します。

static mapping = {
    photo column: 'photo', sqlType: 'VARBINARY(10000)'
}
于 2013-10-25T17:55:51.487 に答える
2

制約を使用してフィールド サイズを設定します。

class MyDomain {
    .....
    byte[] photo

    static constraints = {
        photo(maxSize: 1024 * 1024)
    }
}
于 2013-10-25T16:59:12.057 に答える
0

私もこの問題を抱えていました。Web から約 12 の提案を試しましたが、どれも機能しませんでした。

それは、 DataSource.groovydbCreateの開発環境を変更するまでです。データを保持したかったので、 「更新」に設定しました。次に、データベースが再作成されない限り、データベースの列のサイズを変更できないと推測しました。そこで、「create 」に変更し、grails run-appを実行し、 shutdownしてから、「 update 」に戻しました。すべてのデータを再入力する必要がありましたが、その時点から画像のアップロードは機能しました。

于 2014-03-31T01:41:39.493 に答える