IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Envoyer et récupèrer une image par DataSnap - Limitation BLOB


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué

    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Février 2013
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 148
    Points : 199
    Points
    199
    Par défaut Envoyer et récupèrer une image par DataSnap - Limitation BLOB
    Bonjour,

    Je développe une application mobile (phonegap / html - js) qui prends des photos, et les envois à un serveur via REST.
    Pour cela, lorsque l'application mobile prends la photo, je récupère le code de la photo en base64, je scinde ce code (donc une chaîne très longue) tous les 1000 caractères par exemple, je boucle dessus, et j'envoi au serveur REST ces portions de 1000, le serveur lui les concaténant dans un champs BLOB de type text.
    Le problème est que sur des grosses photos cela ne passe pas.
    Je n'arrive pas à identifier si cela proviens de la limitation du BLOB (je ne pense pas), ou alors de l'algo sur le serveur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    procedure TServerMethods.addObservationPictureDatas(const user, pass, numObs, pictureDatas : string);
    var
      currentPictureDatas: string;
    begin
     
          // On crée l'objet de base de données
          with getSyncFrbf( getNumUser( user, pass ) ) do begin
     
              // On insère la nouvelle chaine
              RequestParams.Add( 'pictureDatas', pictureDatas );
              RequestParams.Add( 'numobs', numObs );
              Request.Add( 'UPDATE REC_OBSERVATIONS SET PICTUREDATAS = ' );
              Request.Add( '(SELECT PICTUREDATAS FROM REC_OBSERVATIONS WHERE NUM_OBS = :numobs) || :pictureDatas' );
              Request.Add( 'WHERE NUM_OBS = :numobs' );
              ExecSQLAndCommit;
              Free;
     
          end;
    Vu que je reste un grand débutant sous delphi, peut être que je dois utiliser une autre méthode ? Un stream ?

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tout dépend le SGBD !
    Tu as TINYBLOB, BLOB, MEDIUMBLOB et LONGBLOB en MySQL chacun correspondant à une puissance de 2 (^8 ^16 ^24 et ^32)
    Ainsi que TINYTEXT, TEXT, MEDIUMTEXT, et LONGTEXT

    Pense au MaxBlobSize de ton TSQLConnection
    Cela concerne DataSnap mais peut-être aussi la connexion au SGBD
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre habitué

    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Février 2013
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 148
    Points : 199
    Points
    199
    Par défaut
    Bonjour ShailLeTroll,

    Je ne pense pas que ce soit datasnap, car pour éviter toute limitation, je fait plusieurs appels de X caractères qui ce concatène dans la valeur de l'enregistrement.

    Penses tu que le MaxBlobSize agisse dans le cas de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
              Request.Add( 'UPDATE REC_OBSERVATIONS SET PICTUREDATAS = ' );
              Request.Add( '(SELECT PICTUREDATAS FROM REC_OBSERVATIONS WHERE NUM_OBS = :numobs) || :pictureDatas' );
              Request.Add( 'WHERE NUM_OBS = :numobs' );
    vu que pictureDatas ne peut faire que 1000 caractères max.

    La base est du firebird, je crois que le LONGBLOB n'existe pas

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour
    Citation Envoyé par LaurentC33 Voir le message
    Bonjour ShailLeTroll,
    Je ne pense pas que ce soit datasnap, car pour éviter toute limitation, je fait plusieurs appels de X caractères qui ce concatène dans la valeur de l'enregistrement.
    en effet , au vue de ta manière de faire ce n'est pas la taille du datasnap qui pose problème

    par contre je ne pense pas que la concaténation de chaine soit une bonne idée (a cause de null pouvant être dans les chaines)
    en plus le SQL peut être simplifié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
              Request.Add( 'UPDATE REC_OBSERVATIONS SET PICTUREDATAS =PICTURESDATA||:picturesdatas ' );
              Request.Add( 'WHERE NUM_OBS = :numobs' );
    La base est du firebird, je crois que le LONGBLOB n'existe pas
    non avec Firebird il n'y a que 2 types de Blobs (sub_type Text ou Binary)

    j'ai déjà lu/vu quelque chose au sujet de la remontée d'image via datasnap lors de mes recherches pour envoyer une image du serveur vers le client
    (mon blocage était du à la taille du buffer datasnap lui-même)

    un avec les mots clé datasnap+send+image
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre habitué

    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Février 2013
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur multimédia
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 148
    Points : 199
    Points
    199
    Par défaut
    Bon merci à vous deux !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    'UPDATE REC_OBSERVATIONS SET PICTUREDATAS =PICTURESDATA||:picturesdatas '
    Ça marche nickel, quelque soit la taille de l'image !

    Merci à vous.

    Au début, dans ma première version, je concaténais avant la requête à partir d'un select, ça ne marchais pas à ce moment là à cause du TSQLConnection !
    Merci encore

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    J'espère qu'il y a le WHERE
    mais j'ai toujours un doute quant à la concaténation et le passage par string
    le moindre null dans la chaine et
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. WCF envoyer une image par le canal
    Par Nemesis007 dans le forum Windows Mobile
    Réponses: 1
    Dernier message: 22/01/2010, 11h47
  2. Envoyer une image par l'intermédiaire des Socket
    Par Hellgast dans le forum C++Builder
    Réponses: 1
    Dernier message: 10/11/2009, 00h01
  3. Récupérer une image envoyée au serveur en POST
    Par ultracoxy dans le forum Java ME
    Réponses: 9
    Dernier message: 28/12/2007, 11h49
  4. Récupérer une image générée par un lien
    Par furtif1 dans le forum Langage
    Réponses: 1
    Dernier message: 03/05/2007, 11h11
  5. [FLASH MX] Envoyer une image par e-mail
    Par skyjoe dans le forum Flash
    Réponses: 2
    Dernier message: 22/10/2004, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo