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.