Sauvegarder une image sur un serveur

a marqué ce sujet comme résolu.

Bonjour tout le monde;

Voici mon problème/question, je suis en train de développer une petite application sur mon temps libre pour découvrir le monde d’Android. Cette application communique avec un serveur local (pour l’instant WAMP) . J’ai regardé de nombreux tutos (dont celui de Andr0 "Communication entre Android et PHP/MySQL ") et j’ai fini par en déduire que la meilleure façon de communiquer avec un serveur était d’utiliser Retrofit. J’arrive à faire une connexion basique, à faire remonter des informations de ma base et à créé des tuples (exemple un utilisateur). Mais j’ai des problèmes pour sauvegarder une image sur mon serveur. J’ai vu qu’il y avait une multitude de façon de le faire, mais je dois avouer que je suis un peu perdu étant nouveau dans le monde d’Android . Quelqu’un pourrait me mettre sur la bonne voie ^^. Je vous en remercie d’avance.

Bonne journée à tous :D.

+0 -0

Il y a 3-4 ans j’ai eu à faire ça en Java (sous PC), et mon code ressemblait à ça : https://gist.github.com/anonymous/4153047 (je n’arrive plus à trouver l’article correspondant qui explique ce code).

Mais voici mes explications :

Lorsque tu envoies une image à un serveur PHP, tu utilises la method POST. Et le contenu du formulaire va être envoyé en plusieurs fois.

Ligne 20 : Tu demandes au serveur d’ouvrir une connexion, en lui donnant une clé unique (boundary) pour qu’il reconnaisse les requêtes suivantes (celle qui envoie le fichier en plusieurs parties).

Ligne 29-42 : Tu configures l’header des requêtes qui vont envoyer les parties du fichier.

Ligne 45-50 : Grâce à la boucle tu envoies les parties de fichier.

Ligne 52-56 : Tu as la réponse du serveur (souvent du HTML, ou du JSON (si c’est de l’ajax)).


De mon côté j’avais personnalisé la fonction comme ça :

 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
package net.minecraft.src; // J'ai appris le java, juste pour ça. :P

import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

//...

public class GuiScreenShots extends GuiScreen
{
  //...
  private void SendPicture() {
      try {
          String charset = "utf-8", CRLF = "\r\n";
          File binaryFile = new File(screenShotDir, (String) ((List) GuiScreenShots.availableScreenShots().get(IndexSelection)).get(0)+".png");
          String boundary = Long.toHexString(System.currentTimeMillis());
  
          URLConnection connection;
          connection = new URL("http://www.hostingpics.net/codes_iframe.php").openConnection();
          connection.setDoOutput(true);
          connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
          PrintWriter writer = null;
          try {
              OutputStream output = connection.getOutputStream();
              writer = new PrintWriter(new OutputStreamWriter(output, charset), true);
  
              writer.append("--" + boundary).append(CRLF);
              writer.append("Content-Disposition: form-data; name=\"id_m\"").append(CRLF);
              writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
              writer.append(CRLF);
              writer.append("828").append(CRLF).flush();

              writer.append("--" + boundary).append(CRLF);
              writer.append("Content-Disposition: form-data; name=\"photo1\"; filename=\"" + binaryFile.getName() + "\"").append(CRLF);
              writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(binaryFile.getName())).append(CRLF);
              writer.append("Content-Transfer-Encoding: binary").append(CRLF);
              writer.append(CRLF).flush();
              InputStream input = null;
              try {
                  input = new FileInputStream(binaryFile);
                  byte[] buffer = new byte[1024];
                  for (int length = 0; (length = input.read(buffer)) > 0;) {
                      output.write(buffer, 0, length);
                  }
                  output.flush();
              } finally {
                  if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
              }
              writer.append(CRLF).flush();
              writer.append("--" + boundary + "--").append(CRLF);
          } finally {
              if (writer != null) writer.close(); 
              
              BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
              String read = bufferedreader.readLine(), url_num = null, url_id = null;
              Pattern pattern_name = Pattern.compile("http://img(.*).hostingpics.net/thumbs/mini_(.*).png");
              Matcher matcher = null;
              do {
                  matcher = pattern_name.matcher(read);
                  read = bufferedreader.readLine();
                  if (matcher.find()) {
                      System.out.println("Upload du screen.");
                      url_num = matcher.group(1);
                      url_id = matcher.group(2);
                      Sys.openURL("http://img"+url_num+".hostingpics.net/pics/"+url_id+".png");
                      File file = new File(screenShotDir, (String) ((List) GuiScreenShots.availableScreenShots().get(IndexSelection)).get(0)+".txt");
                      file.createNewFile();
                      BufferedWriter output = new BufferedWriter(new FileWriter(file, true));
                      output.write("http://img"+url_num+".hostingpics.net/pics/"+url_id+".png");
                      output.flush();
                      output.close();
                  }
              } while (read != null && url_id == null);
              bufferedreader.close();
          }
      } catch (IOException ioexception) {
          ioexception.printStackTrace();
      }
  }
}

Peut-être que le code diffère mais le principe reste le même.

+0 -0

Merci pour la réponse mais pour l’instant je recherche quelque chose plus baser sur Retrofit du style : @Multipart @POST("/quefaire/upload_avatar") Call<String> uploadService(@Part("monfichier") RequestBody file);

ou encore : @Multipart @POST("upload") Call<ResponseBody> uploadPhoto(@Part("description) RequestBody description, @Part MultipartBody.Part photo);

Comme je fais toutes mes requêtes ainsi et voulant découvrir un peut plus le coter de Retrofit ^^.

Mon but final est de sauvegarder l’image sur le serveur dans un premier temps puis plus tard de la charger dans l’application. J’ai adapté un code que j’ai trouvé sur le site suivant : ici il fonctionne relativement bien mais je sais pas si c’est la meilleurs façon d’utiliser rétrofit. J’essaye de rendre le code le plus performant possible ^^.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte