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:
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:
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:
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 :
1 2
|
utmp.encodeImage(bos.toByteArray()) |
par
utmp.setImage( Base64.encodeToString(bos.toByteArray(), Base64.DEFAULT));
j'obtiens l'erreur :
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.
Partager