2

Mongo でイメージをバイト配列として格納するのに苦労しています。私のドメインはとてもシンプルです

class Book {
    String title
    String author
    byte[] photo
    String photoType
}

画像はすべて 300kB 未満なので、そもそも GridFS は避けます。永続化されると、写真は文字列 (常に 11 バイト) として保存されているように見えます

db.book.find() { "_id" : NumberLong(15), "author" : "", "photo" : "[B@774dba87", "photoType" : "image/jpeg", "title" : " "、"バージョン": 0 }

私のコントローラは次のように読み取ります: def saveImage() {

    def bookInstance
    if(request instanceof MultipartHttpServletRequest) {

        MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request;
        CommonsMultipartFile file = (CommonsMultipartFile)multiRequest.getFile("photo");

        params.photoType  = file.getContentType()
        print "nb bytes " +file.bytes.length    //TODO

        bookInstance = new Book(params)
        bookInstance.photo=new byte[file.bytes.length]
        bookInstance.photo = file.getBytes()

        def okcontents = ['image/png', 'image/jpeg', 'image/gif']
        if (! okcontents.contains(file.getContentType())) {
            flash.message = "Photo must be one of: ${okcontents}"
            render(view:'create', model:[bookInstance:bookInstance])
            return;
        }

        log.info("File uploaded: " + bookInstance.photoType)
    }


    if (!bookInstance.save()) {
        render(view:'create', model:[bookInstance:bookInstance])
        return;
    }
    flash.message = "Book Photo (${bookInstance.photoType}, ${bookInstance.photo.size()} bytes) uploaded."
    redirect(action: "show", id: bookInstance.id)
}

私はmongoプラグインでGrails 2.2を使用しています...

ヒントをありがとうございます (2013 年もよろしくお願いします!)

乾杯フィリップ

4

2 に答える 2

2

encodeBase64 / decodeBase64 が正しいアプローチです。

あなたが提供したコードは、以前の mongo-gorm プラグイン リリースで正常に動作します。grails 2.2.0および配列が1.1.0.GA mongodb適切に変換されない場合、バグ GPMONGODB-265 が提出されました。

代替の gorm プラグインまたは純粋な groovy mongo ラッパーgmongoの使用を検討してください。

于 2013-01-29T21:31:23.397 に答える
0
def imgStream = file.getInputStream()
byte[] buf = new byte[310000]
int len =imgStream.read(buf, 0, 310000)
ByteArrayOutputStream bytestream = new ByteArrayOutputStream()
while(len > 0) {
    bytestream.write(buf, 0, len)
    len =imgStream.read(buf, 0, 310000)
}
bookInstance.photo = bytestream.toByteArray()
bookInstance.save()
于 2013-01-04T19:11:16.563 に答える