5 votes

comment créer un téléchargement de fichiers dans grails qui fonctionne avec oracle ?

J'ai le problème suivant :

J'ai essayé de créer une fonctionnalité simple de téléchargement de fichiers dans Grails. J'ai juste créé une classe de domaine avec un

byte[] rawFile

en tant que propriété. Grails a fait la plupart du reste pour moi. Cela a bien fonctionné pour le hsqldb standard dans l'environnement de développement.

Puis je l'ai déployé sur le serveur avec un db oracle configuré (thin driver). Tout fonctionne bien avec la base de données Oracle, sauf le téléchargement de fichiers. Pour le téléchargement de fichier, j'obtiens (pour autant que je m'en souvienne)

SQLException : ORA-01461 : peut lier une valeur LONG uniquement pour l'insertion dans un LONG.

J'ai essayé plusieurs façons de résoudre ce problème (y compris certains columnmappings en blobs et l'utilisation de java.sql.blob au lieu de byte[]) mais rien n'a vraiment fonctionné et j'ai pris une direction où mon code ne serait plus indépendant de la base de données.

Google ne m'a pas vraiment aidé et mes livres sur Grails ne m'aident pas non plus.

Sauvegarder le fichier sur le disque n'est pas une bonne solution à mon avis.

Voici donc ma question :

comment créer un téléchargement de fichiers dans grails qui fonctionne avec oracle ?

Mise à jour J'ai obtenu quelques informations supplémentaires. J'ai réussi à reproduire le problème avec l'édition XE d'Oracle :

Hibernate crée une colonne VARBINARY(255) pour le fichier rawFile. J'ai donc essayé de télécharger un fichier de 4 octets et cela a fonctionné.

J'ai ensuite changé manuellement le type de la colonne en "blob" et cela a fonctionné avec des fichiers plus gros.

J'ai ensuite ajouté

static mapping = {
    columns {
        rawFile type:'blob'
    }
}

à ma classe de domaine et ça a cessé de fonctionner :

ERROR errors.GrailsExceptionResolver - [B ne peut pas être converti en java.sql.Blob java.lang.ClassCastException : [B ne peut pas être converti en java.sql.Blob

:-(

4voto

Abdullah Jibaly Points 14269

Au lieu de définir le type de blob, essayez d'augmenter la contrainte maxSize :

static constraints = {
    rawFile(maxSize: 20 * 1024 * 1024) // 20 MBs
    // ...
}

4voto

Ed OConnor-Giles Points 686

Si vous souhaitez utiliser un champ Blob dans Oracle, définissez votre propriété de domaine sur byte[] et définissez le type sur org.hibernate.type.MaterializedBlobType. Le type MaterializedBlobType gère la conversion entre Oracle (et probablement d'autres bases de données, mais je ne l'ai fait que sur Oracle) et byte[].

byte[] blobFile

static mapping = {
    blobFile type: org.hibernate.type.MaterializedBlobType
}

1voto

Abdullah Jibaly Points 14269

Je ne suis pas sûr de ce que vous faites dans votre contrôleur, essayez de le faire manuellement pour voir ce qui se passe :

request.fileMap.each { name, file ->
    if (!file.empty) {
        model.rawFile = file.bytes
    }
}
model.save()

1voto

jstricker Points 438

Essayez de régler le sqlType .

Utilisation d'un champ de domaine de type byte[] con sqlType réglé sur "blob" en el mapping Le bloc fonctionne pour moi avec Grails 2.3.1 et Oracle 11g. Grails gère automatiquement la conversion de type.

class Image {
    byte[] image
    static mapping = {
        image(sqlType: "blob")
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X