[JAVA] [Android] Hochladen von Bildern vom Terminal auf den Server

Einführung

Da ich Probleme mit der Funktion hatte, Bilder auf Android zu POSTEN und auf dem Server zu speichern, schreibe ich sie als mein eigenes Memorandum und meine eigene Ausgabe. Ich habe seit einem halben Jahr nicht mehr an dem Programm gearbeitet, daher mag es seltsam sein, aber bitte vergib mir.

Nachtrag

Ich habe Ihren Punkt erhalten. Vielen Dank!

OkHTTP2 wird als veraltet behandelt. Stellen Sie sicher, dass Sie die neueste Version 4.3.1 verwenden.

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

Umgebung

Ich benutze OkHttp in Android Studio.

OkHttp eingeführt

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

#### **`Hinzugefügt.(2.7.Ändern Sie 5 je nach Variante.)~~`**

build.gradle


//~~ weggelassen ~~
dependencies{
  //~~ weggelassen ~~
  implementation 'com.squareup.okhttp:okhttp:4.3.1'//Nachtrag
}

Erledigt.

AsyncTask Da es per HTTP-Kommunikation gesendet wird, erfolgt es asynchron.

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 zum Senden"; 
        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);
    }
}

Ich habe viele Änderungen vorgenommen, also habe ich es umgeschrieben. Auch mit der Änderung java.io.IOException: Cleartext HTTP traffic to example.com not permitted Möglicherweise wird ein solcher Fehler angezeigt. Dies liegt daran, dass die HTTPS-Kommunikation standardmäßig verwendet wird. Daher muss eine Methode geschrieben werden, um die HTTP-Kommunikation zu ermöglichen. Weitere Informationen dazu finden Sie unter hier.

alter Code

OkHttpTask_old.java


/**Löschen
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 posten
        String url = "http://";
        File file = new File(params[0]);

        /**Löschen
        *Stellen Sie den Inhalt hier auf POST
        RequestBody requestBody = new MultipartBuilder()
                .type(MultipartBuilder.FORM)
                .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("image/jpg"), file))
                .build();
        */

        //Stellen Sie den Inhalt hier auf POST(Hier ändern)
        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 des zu sendenden Bildes
  private Uri _imageUri;
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //Rufen Sie hier an
        new OkHttpTask().execute(url);   
}

Empfänger

Speichern Sie einfach die veröffentlichte Datei.

UpLoad.java


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

	public void doPost(HttpServletRequest req,HttpServletResponse res) throws IOException, ServletException {
		String name="no_name";
		//multipart/form-Holen Sie sich alle Teilelemente dieser Anfrage durch Daten
		for (Part part : req.getParts()) {
			//Name holen
			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);
				}
			}
		}
	}
}

Referenzlink

Die Geschichte der ersten Verwendung von OkHttp https://qiita.com/LyricalMaestro0/items/698c77f5a964b5658bbb

Recommended Posts

[Android] Hochladen von Bildern vom Terminal auf den Server
POST-Bilder von Android auf PHP mit Retrofit
Lassen Sie das Armbandgerät mit Bluetooth über die Android-App vibrieren
Überprüfen Sie die Kommunikation von Android zum node.js-Server mit Protokollpuffern
Senden Sie den Wert des Beschleunigungssensors per UDP von Android an den PC
Stoppen Sie das erneute Senden vom Client zum Server
[Android, Java] Methode zum Ermitteln des abgelaufenen Datums aus zwei Daten
Der Weg von JavaScript nach Java
[Android] Ich möchte den Listener über die Schaltfläche in ListView abrufen
So schränken Sie das Bildformat in der Galerie unter Android ein und wählen und importieren Sie dann mehrere Bilder
[Java] So rufen Sie die von HTML auf der Serverseite übergebenen Parameter ab
[Android] Überprüfen Sie die tatsächliche Maschine, ohne Ihre Hände mit automatischem Scrollen zu bewegen
Untersuchen Sie den Ersatz von Docker zu Podman.
[Ruby] Von den Grundlagen bis zur Injektionsmethode
Kick ShellScript auf dem Server von Java
* Android * Speichern / Laden von Bildern in einen externen Speicher
Versuchen Sie es mit der Emotion API von Android
Lernen Sie beim Erstellen eines WEB-Servers die Einführung in die Entwicklung von WEB-Anwendungen anhand der Grundlagen
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Migration von Eclipse zu IntelliJ (unterwegs)
3 Möglichkeiten zum Importieren von Bibliotheken in Android Studio
Was tun, wenn der Server-Tomcat stirbt?
Wenn Eclipse den Server nicht starten kann
Migrieren Sie von Java zu Server Side Kotlin + Spring-Boot
SSH-Login beim App-Server mit Heroku
Migration von der Eclipse-Serverfunktion (Tomcat) zum Einbetten von Tomcat
Holen Sie sich Ihre Versionsnummer in der Android-App
Minecraft BE Serverentwicklung von PHP nach Java
[Android-Entwicklung] Holen Sie sich mit Java Bilder vom Server und legen Sie sie in ImageView fest! !!