[JAVA] [Android] Téléchargement d'images du terminal vers le serveur

introduction

Comme j'ai eu des problèmes avec la fonction de POST des images sur Android et de les enregistrer sur le serveur, je les écris comme mon propre mémorandum et ma propre sortie. Je n'ai pas travaillé sur le programme depuis six mois, donc cela peut être étrange, mais pardonnez-moi s'il vous plaît.

Postscript

J'ai reçu votre point. Je vous remercie!

OkHTTP2 est traité comme obsolète. Assurez-vous d'utiliser la dernière version 4.3.1.

https://square.github.io/okhttp/changelog_3x/#version-300-rc1 https://square.github.io/okhttp/changelog/

environnement

J'utilise OkHttp dans Android Studio.

Introduction d'OkHttp

implementation 'com.squareup.okhttp:okhttp:2.7.5'

#### **`Ajoutée.(2.7.Changez 5 selon la varsion.)~~`**

build.gradle


//~~ Omis ~~
dependencies{
  //~~ Omis ~~
  implementation 'com.squareup.okhttp:okhttp:4.3.1'//Postscript
}

Terminé.

AsyncTask Puisqu'il est envoyé par communication Http, il est effectué de manière asynchrone.

OkHttpTask.java


import android.os.AsyncTask;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class HttpTask extends AsyncTask<String, Void, String> {

    String responseBody;
    public HttpTask(){}

    @Override
    protected String doInBackground(String... params) {
        String url = "URL à envoyer"; 
        MediaType media = MediaType.parse("multipart/form-data");
        try {
            File file = new File(params[0]);
            String FileName = file.getName();
            String boundary = String.valueOf(System.currentTimeMillis());

            RequestBody requestBody = new MultipartBody.Builder(boundary).setType(MultipartBody.FORM)
                    .addFormDataPart("file", FileName, RequestBody.create(media, file))
                    .build();

            Request request = new Request.Builder()
                    .url(url)
                    .post(requestBody)
                    .build();

            OkHttpClient client = new OkHttpClient();
            Response response = client.newCall(request).execute();
            responseBody = response.body().string();

            return responseBody;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return responseBody;
    }

    @Override
    protected void onPostExecute(String result) {
        Log.d("a",result);
    }
}

J'ai fait beaucoup de changements, donc je l'ai réécrit. Aussi, avec le changement java.io.IOException: Cleartext HTTP traffic to example.com not permitted Vous pouvez voir une erreur comme celle-ci. En effet, la communication HTTPS est utilisée par défaut, il est donc nécessaire d'écrire une méthode pour autoriser la communication HTTP. Pour plus d'informations sur la façon de procéder, veuillez consulter ici.

<détails>

ancien code </ summary>

OkHttpTask_old.java


/**Effacer
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.MultipartBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
*/
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class OkHttpTask extends AsyncTask<String, Void, String> {
  public OkHttpTask(){}

    @Override
    protected String doInBackground(String... params) {
        //URL du message
        String url = "http://";
        File file = new File(params[0]);

        /**Effacer
        *Définissez le contenu sur POST ici
        RequestBody requestBody = new MultipartBuilder()
                .type(MultipartBuilder.FORM)
                .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("image/jpg"), file))
                .build();
        */

        //Définissez le contenu sur POST ici(Changer ici)
        RequestBody requestBody = new MultipartBody.Builder()
                .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("image/jpg"), file))
                .build();


        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();

        String result="";
        try {
            Response response = client.newCall(request).execute();
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
            {
                result = response.body().string();
            }
        } catch (Exception e) {}

        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        Log.d("end:",result);
    }
}
*/
MainActivity

MainActivity.java



public class MainActivity extends AppCompatActivity {
  //URI de l'image à envoyer
  private Uri _imageUri;
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Appelez ici
        new OkHttpTask().execute(url);   
}

Bénéficiaire

Enregistrez simplement le fichier publié.

UpLoad.java


@WebServlet("/Upload")
@MultipartConfig(location = "Emplacement de stockage")
public class upload extends HttpServlet {

	public void doPost(HttpServletRequest req,HttpServletResponse res) throws IOException, ServletException {
		String name="no_name";
		//multipart/form-Obtenir tous les éléments Part de cette demande fournis par les données
		for (Part part : req.getParts()) {
			//Obtenir le nom
			for (String cd : part.getHeader("Content-Disposition").split(";")) {
				String str = cd.trim();
				if (str.startsWith("filename")) {
					String str2 = str.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
					File f = new File(str2);
					name = f.getName();
					part.write(name);
				}
			}
		}
	}
}

Lien de référence

L'histoire de l'utilisation d'OkHttp pour la première fois https://qiita.com/LyricalMaestro0/items/698c77f5a964b5658bbb

Recommended Posts

[Android] Téléchargement d'images du terminal vers le serveur
POST des images d'Android vers PHP en utilisant Retrofit
Faire vibrer le bracelet avec Bluetooth à partir de l'application Android
Vérifiez la communication entre Android et le serveur node.js avec des tampons de protocole
Envoyer la valeur du capteur d'accélération d'Android au PC par UDP
Arrêter de renvoyer du client au serveur
[Android, Java] Méthode pour trouver la date écoulée à partir de deux dates
La route de JavaScript à Java
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
Comment affiner le format d'image de la galerie sur Android, puis sélectionner et importer plusieurs images
[Java] Comment récupérer les paramètres passés du html côté serveur
[Android] Vérifiez la machine réelle sans bouger les mains grâce au défilement automatique
Examinez le remplacement de Docker vers Podman.
[Ruby] Des bases à la méthode inject
Kick ShellScript sur le serveur depuis Java
* Android * Enregistrement / chargement d'images sur un stockage externe
Essayez d'utiliser l'API Emotion d'Android
Apprenez à créer un serveur WEB Introduction au développement d'applications WEB à partir des bases
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
Migration d'Eclipse vers IntelliJ (en cours)
3 façons d'importer des bibliothèques dans Android Studio
Que faire si le serveur Tomcat meurt
Lorsque Eclipse ne parvient pas à démarrer le serveur
Migrer de Java vers Kotlin côté serveur + Spring-boot
Connexion SSH au serveur d'applications avec heroku
Migration de la fonction serveur Eclipse (Tomcat) vers Embed Tomcat
Obtenez votre numéro de version dans l'application Android
Développement de serveur Minecraft BE de PHP à Java
[Développement Android] Obtenez des images du serveur avec Java et définissez-les dans ImageView! !!