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

Android Discussion :

Upload image AppEngine


Sujet :

Android

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Points : 230
    Points
    230
    Par défaut Upload image AppEngine
    Bonjour,

    J'essaie depuis plusieurs jours d'uploader une image depuis android sur un serveur Appengine.
    Je développe sous eclipse luna avec le SDK appengine 1.9.21 .

    La communication entre les 2 systèmes s'effectues à l'aide de requête JSON créée automatiquement grâce à la fonction dans eclipse "google -> genereate cloud endpoint client library".

    Je trouve cette fonction plutôt pratique, il suffit de changer la classe Entity pour que le reste du code se génère automatiquement sur la partie cliente.

    J'ai donc créé la classe suivante:
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
     
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
     
     
    @Entity
    public class ListeModel implements  Serializable{
     
     
    	private static final long serialVersionUID = 7390103890167670089L;
    	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	private Long id;
    	private String titre;
    	private String avatar;
    	private String idBlobkey;
    	private byte[] image;
    	private Long idUtilisateur;
    	private Boolean visibleall;
     
    	public ListeModel() {
    		// TODO Auto-generated constructor stub
    	}
     
     
    	public Long getId() {
    		return id;
    	}
     
    	public void setId(Long id) {
    		this.id = id;
    	}
     
    	public String getTitre() {
    		return titre;
    	}
     
    	public void setTitre(String titre) {
    		this.titre = titre;
    	}
     
    	public String getAvatar() {
    		return avatar;
    	}
     
     
    	public void setAvatar(String avatar) {
    		this.avatar = avatar;
    	}
     
     
    	public String getIdBlobkey() {
    		return idBlobkey;
    	}
     
     
    	public void setIdBlobkey(String idBlobkey) {
    		this.idBlobkey = idBlobkey;
    	}
     
     
    	public byte[] getImage() {
    		return image;
    	}
     
     
    	public void setImage(byte[] image) {
    		this.image = image;
    	}
     
     
    	public Long getIdUtilisateur() {
    		return idUtilisateur;
    	}
     
     
    	public void setIdUtilisateur(Long idUtilisateur) {
    		this.idUtilisateur = idUtilisateur;
    	}
     
     
    	public Boolean getVisibleall() {
    		return visibleall;
    	}
     
     
    	public void setVisibleall(Boolean visibleall) {
    		this.visibleall = visibleall;
    	}
     
     
     
    }

    et voici le code partie client pour créer une Entity:
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    public class ValideEndpointsTask extends AsyncTask<Void, Void, Integer> {
     
     
     
    			 protected Integer doInBackground(Void... params) {
     
     
     
     
     
    				 try {
    					 ListeModel utmp=new ListeModel();
    						utmp.setTitre(titre.getText().toString());
    						utmp.setIdUtilisateur(MyUser.profile.getId());
    						utmp.setVisibleall(isvisible.isChecked());
    						if(imageModifie)
    						{
    							ByteArrayOutputStream bos = new ByteArrayOutputStream();
    							newImage.compress(CompressFormat.PNG, 0, bos);
                                                            utmp.encodeImage(bos.toByteArray())
    							utmp.setImage( Base64.encodeToString(bos.toByteArray(), Base64.DEFAULT));
    						}
     
     
     
    						ListeModel resultlm=null;
    					 Listemodelendpoint.Builder lmendpointBuilder = new Listemodelendpoint.Builder(
    							 AndroidHttp.newCompatibleTransport(),
    							 new JacksonFactory(),
    							 new HttpRequestInitializer() {
    								 public void initialize(HttpRequest httpRequest) { }
    							 });
    					 Listemodelendpoint lmendpoint = CloudEndpointUtils.updateBuilder(
    							 lmendpointBuilder).build();
     
    						 resultlm = lmendpoint.insertListeModel(utmp).execute();
     
     
     
     
    				 } catch (IOException e) {
    					 e.printStackTrace();
    					 return Integer.valueOf(0);
    				 }
    				 return Integer.valueOf(1);
    			 }
                }

    l'image est encodé en String pour être envoyé au serveur. ci dessous la fonction généré automatique pour l'encodage de l'image:


    lorsque j'essaie d'envoyer l'image je reçois l'erreur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Method: listemodelendpoint.insertListeModel
    Error Code: 400
    Reason: badRequest
    Message: com.google.appengine.repackaged.org.codehaus.jackson.JsonParseException: Illegal character '_' (code 0x5f) in base64 content
     at [Source: N/A; line: -1, column: -1]
    Il doit y avoir un problème sur l'encodage/décodage...


    lorsque je change la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                                                            utmp.encodeImage(bos.toByteArray())
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    utmp.setImage( Base64.encodeToString(bos.toByteArray(), Base64.DEFAULT));

    j'obtiens l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Method: listemodelendpoint.insertListeModel
    Error Code: 400
    Reason: badRequest
    Message: java.lang.IllegalArgumentException: image: byte[] properties must be 1500 bytes or less.  Instead, use com.google.appengine.api.datastore.Blob, which can store binary data of any size.

    Quelqu'un pourrait m'aider un peu?

    D'avance merci.
    [Android] Shopy liste de course (Java)

    votre fidèl serviteur


  2. #2
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Points : 230
    Points
    230
    Par défaut
    J'ai modifié un peu le code:

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    /**
             * This inserts a new entity into App Engine datastore. If the entity already
             * exists in the datastore, an exception is thrown.
             * It uses HTTP POST method.
             *
             * @param listemodel the entity to be inserted.
             * @return The inserted entity.
             */
    	@ApiMethod(name = "insertListeModel", httpMethod = "POST")
    	public ListeModel insertListeModel(ListeModel listemodel) {
    		EntityManager mgr = getEntityManager();
    		try {
    			if (containsListeModel(listemodel)) {
    				throw new EntityExistsException("Object already exists");
    			}
     
     
     
     
    			FileService fileService = FileServiceFactory.getFileService();
    			if(listemodel.getImage()!=null && !listemodel.getImage().equals(""))
    			{
    				byte[] data = listemodel.getImage();
     
     
     
     
    			   // BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    				/**
                                     *  MIME Type for
                                     *  JPG use "image/jpeg" for PNG use "image/png"
                                     *  PDF use "application/pdf"
                                     *  see more: https://en.wikipedia.org/wiki/Internet_media_type
                                     */
     
    				String mimeType = "image/png";
     
    				// save data to Google App Engine Blobstore 
     
    				listemodel.setImage(null);
    				mgr.persist(listemodel);
    				AppEngineFile file;
    					file = fileService.createNewBlobFile(mimeType,"LM_"+listemodel.getId());
    					FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
    					writeChannel.write(java.nio.ByteBuffer.wrap(data));
    					writeChannel.closeFinally();
     
    					// your blobKey to your data in Google App Engine BlobStore
    					BlobKey blobKey = fileService.getBlobKey(file);
     
    					// THANKS TO BLOBKEY YOU CAN GET FOR EXAMPLE SERVING URL FOR IMAGES
     
    					//  UploadOptions uploadOptions = UploadOptions.Builder
    					//		  	.withGoogleStorageBucketName("photobucket11");
     
    					// Get the image serving URL (in https:// format)
    					String imageUrl = ImagesServiceFactory.getImagesService().getServingUrl(ServingUrlOptions.Builder.withBlobKey(blobKey).secureUrl(true));
     
    					//       ImagesService imagesService = ImagesServiceFactory
    					//               .getImagesService();
    					//      ServingUrlOptions servingOptions = ServingUrlOptions.Builder
    					//               .withBlobKey(blobKey);
     
    					//       String imageUrl = imagesService.getServingUrl(servingOptions);
     
    					if(listemodel.getIdBlobkey()!=null)
    					{
    						BlobKey blobKeytmp= new BlobKey(listemodel.getIdBlobkey());
    						final AppEngineFile f = fileService.getBlobFile(blobKeytmp);
     
    						if(f.isReadable())
    						{
     
    							if(f.hasFinalizedName())
    							{
    								fileService.delete(f); // Problematic line
    							}
    						}
     
    					}
     
    					listemodel.setAvatar(imageUrl);
    					listemodel.setIdBlobkey(blobKey.getKeyString());
    			}
     
    					mgr.persist(listemodel);
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
     
     
    				} finally {
    					mgr.close();
    				}
    				return listemodel;
    			}


    j'obtiens l'erreur:
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    com.google.api.server.spi.SystemService invokeServiceMethod: exception occurred while calling backed method
    com.google.apphosting.api.ApiProxy$CallNotFoundException: The API package 'file' or call 'Create()' was not found.
    	at java.lang.Thread.getStackTrace(Thread.java:1589)
    	at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:116)
    	at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:65)
    	at com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:590)
    	at com.google.appengine.api.files.FileServiceImpl.create(FileServiceImpl.java:512)
    	at com.google.appengine.api.files.FileServiceImpl.createNewBlobFile(FileServiceImpl.java:111)
    	at com.listecourses.model.ListeModelEndpoint.insertListeModel(ListeModelEndpoint.java:182)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:45)
    	at com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:359)
    	at com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:113)
    	at com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet.java:71)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.Server.handle(Server.java:326)
    	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    	at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437)
    	at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:444)
    	at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:230)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300)
    	at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:441)
    	at java.lang.Thread.run(Thread.java:745)


    Je cherche depuis des jours la solution sans succès... c'est frustrant.
    [Android] Shopy liste de course (Java)

    votre fidèl serviteur


Discussions similaires

  1. [Upload] Upload images php
    Par lls dans le forum Langage
    Réponses: 15
    Dernier message: 19/07/2007, 18h23
  2. [Upload] Script upload images
    Par Myriamrv dans le forum Langage
    Réponses: 14
    Dernier message: 07/12/2005, 18h24
  3. [MySQL] pb upload image et update table
    Par digger dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 12/11/2005, 14h09
  4. Réponses: 1
    Dernier message: 31/10/2005, 09h33
  5. [Upload] Probleme upload images
    Par yveslens dans le forum Langage
    Réponses: 6
    Dernier message: 22/08/2005, 09h42

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