Configurer un serveur local avec le téléchargement Go-File-

en premier

Configurer WebServer dans Go et télécharger des fichiers depuis l'application Android

environnement

PC Windows10 Android Studio 4.0 Kotlin 1.3.72 Émulateur de terminal Android (niveau d'API 29) Go 1.11.1

Diagramme

go_server.png Envoyez un fichier depuis l'application Android, enregistrez-le côté serveur et renvoyez le code d'état du serveur à l'application

la mise en oeuvre

Serveur local

Server.go


package controllers

import (
	"fmt"
	"net/http"
	"io/ioutil"
	"os"
)

func apiSampleHandler(w http.ResponseWriter, r *http.Request) {
	switch(r.Method) {
		case "POST":
			fmt.Println("POST")
            //Obtenez les fichiers et les en-têtes téléchargés
			file, fileHeader, _ := r.FormFile ("upload_file") 
			fileName := fileHeader.Filename //Obtenir le nom du fichier à partir de l'en-tête
			defer file.Close()              //Fermez le fichier à la fin
			data, _ := ioutil.ReadAll(file) //Lire le fichier
			saveFile, _ := os.Create(fileName) //Générer un fichier à enregistrer
			defer saveFile.Close()          //Fermez le fichier pour enregistrer à la fin
			_, err = saveFile.Write(data)   //Écrire dans un fichier
			if err != nil {
				fmt.Println("can not write file")
				w.WriteHeader(http.StatusBadRequest)
				return
			}
		case "GET":
			fmt.Println("GET")
	}
    // 200:Retourne OK
	w.WriteHeader(http.StatusOK)
}

// main.Appel de go pour démarrer le serveur
func StartWebServer() error {
	http.HandleFunc("/", apiSampleHandler)
	return http.ListenAndServe(":8080", nil)
}

Exécutez main.go et démarrez le serveur Accédez à http: // localhost: 8080 et assurez-vous que le serveur est opérationnel

Application Android

1.Androidmanifest.xml

Définir l'autorisation d'accéder à Internet

AndroidManifest.xml


<uses-permission android:name="android.permission.INTERNET" />

Étant donné que le paramètre de communication http est désactivé depuis Android 9.0, définissez use CleartextTrafic sur true

AndroidManifest.xml


<application
réduction
    android:usesCleartextTraffic="true">
    <activity android:name=".MainActivity">
réduction
    </activity>
</application>
  1. Générer un fichier

Générez un fichier texte dans la zone spécifique à l'application de l'appareil Android (sous / data / data / {package_name} / files```)

File.kt


const val FILE_EXPAND = ".txt"

class File {
    fun makeTxtFile(context: Context, fileName: String, str: String) {
        try {
            context.openFileOutput(fileName + FILE_EXPAND, Context.MODE_PRIVATE).use {
                it.write(str.toByteArray())
            }
        } catch (e: IOException) {
            Log.e("File", "#makeTxtFile $e")
        }
    }
}

Confirmer la génération du fichier Affichez les fichiers sur l'appareil avec Device File Explorer (https://developer.android.com/studio/debug/device-file-explorer?hl=ja )

    1. Accès au serveur

Lisez le fichier et envoyez le fichier via la communication http

Net.kt


 fun startConnection(context: Context, requestUrl: String, requestMethod: String, fileName: String): Pair<Int, String> {
        val url = URL(requestUrl)                      //Génération d'objets URL
        //Création d'objet UrlConnection
        val urlConnection = url.openConnection() as HttpURLConnection 
        var result = ""
        var responseCode = 0
        try {
            val boundary = "--------------------------" 
            urlConnection.requestMethod = requestMethod // POST,OBTENIR etc.
            urlConnection.doOutput = true               //Envoyer le corps de la demande
            urlConnection.doInput = true                //Réception du corps de réponse
            urlConnection.useCaches = false             //Utilisation du cache
            // multipart/form-data: envoyer plusieurs données, limite: séparation entre plusieurs données
            urlConnection.setRequestProperty(
                "Content-Type",
                "multipart/form-data; boundary=$boundary" 
            )
            val filePath = context.filesDir             //Chemin de la zone spécifique à l'application
            val file = File("$filePath/$fileName$FILE_EXPAND") //Créer un objet fichier
            FileInputStream(file).use { fileInputStream ->
                urlConnection.connect()                 //Établir une connexion
                DataOutputStream(urlConnection.outputStream).use {
                   it.writeBytes(                       //Définir l'en-tête
                       TWO_HYPHEN + boundary + LINE_END +
                               "Content-Disposition: form-data; name=\"upload_file\"; " +
                               "filename=\"$fileName$FILE_EXPAND\"$LINE_END" +
                               "Content-Type: application/octet-stream$LINE_END$LINE_END"
                   )
                   //Écriture de fichier
                   val buffer = ByteArray(BUFFER_SIZE)
                   var bytesRead: Int
                   do {
                       bytesRead = fileInputStream.read(buffer)
                       if (bytesRead == -1) break
                       it.write(buffer, 0, bytesRead)
                   } while (true)
                   it.writeBytes(                       //paramètres de pied de page
                        LINE_END + TWO_HYPHEN + boundary + TWO_HYPHEN + LINE_END
                   )
                   it.flush()
                }
            }
            responseCode = urlConnection.responseCode   //Obtenir le code de réponse
 
            BufferedReader(InputStreamReader(urlConnection.inputStream)).use {
                val sb = StringBuffer()
                for (line in it.readLines()) {
                    line.let { sb.append(line) }
                }
                result = sb.toString()
            }
        } catch (e: Exception) {
            Log.e("Net", "#startConnection$e")
        } finally {
            urlConnection.disconnect()
        }
        return responseCode to result
    }
}

Quatre. Confirmation de l'adresse IP

Confirmez l'adresse IP du serveur (PC) auquel vous souhaitez accéder en exécutant ce qui suit avec l'invite de commande

>ipconfig

Cinq. Connectez le PC et l'appareil Android au même environnement réseau

  1. Connectez-vous avec Android

Définissez http: // {adresse IP confirmée}: 8080 dans requestUrl de Net # startConnection et exécutez l'application

Confirmer le téléchargement du fichier

Vérifiez le même répertoire que main.go sur votre PC Terminer si le fichier a été créé

finalement

La source entière est ici La destination d'accès, RequestMethod et le nom du fichier peuvent être modifiés dynamiquement dans l'application.

Références

Aller côté serveur

Téléchargement de fichier en langue Go

Côté application Android

[Android] Enregistrer les fichiers dans l'application FileOutputStream, FileInputStream Upload File To Server - Android Example [Android] erreur while-FileInputStream.read dans kotlin [Kotlin] Je veux renvoyer plusieurs valeurs!

Recommended Posts

Configurer un serveur local avec le téléchargement Go-File-
Configurer un serveur local avec le téléchargement Go-File-
Configurer un serveur Samba avec Docker
Configurer un serveur HTTPS simple avec asyncio
Comment configurer un serveur de développement local
Configurer un serveur local simple sur votre Mac
[Vagrant] Configurer un serveur API simple avec python
Configurer un serveur Web avec CentOS7 + Anaconda + Django + Apache
Configurer un serveur de messagerie avec Twisted
Configurer un serveur HTTPS simple avec Python 3
Créer un serveur local avec une commande sur une seule ligne [Mac]
Envoyez du courrier avec mailx à un serveur SMTP factice configuré avec python.
Configurez un serveur SMTP de test en Python.
Configurer un serveur UDP en langage C
Configurez un serveur Web local en 30 secondes en utilisant http.server en python 3
Configurer un serveur SMTP simple en Python
Serveur local avec python
Configurer un serveur de ressources Minecraft (Spigot) via docker (2)
Configurer un serveur de fichiers sur Ubuntu 20.04 à l'aide de Samba
Configurez un serveur gratuit sur AWS en 30 minutes
[Partie 1] Configurons un serveur Micra sur Linux
Configurer un serveur de ressources Minecraft (Spigot) via docker
Configurer un environnement de développement Python avec Sublime Text 2
Configurer un environnement de développement Python avec Visual Studio Code
Recharger le serveur configuré avec gunicorn lors du changement de code
Configurer la connexion sociale avec Django
Configurer pygit2 avec un lien statique
Créer un serveur Flask avec Docker
Définissez la fonction Lambda et laissez-la fonctionner avec les événements S3!
Obtenez un environnement local pour DynamoDB avec Docker
Dessinez un ensemble de Mandelbrot avec Brainf * ck
Configurer un proxy inverse vers le serveur https avec CentOS Linux 8 + Apache mod_ssl
Introduction et utilisation de la bouteille Python ・ Essayez de configurer un serveur Web simple avec une fonction de connexion
Configurer un serveur qui traite plusieurs connexions en même temps
Janken Poi avec Python Exécutons sur un serveur local Windows pour les débutants
Lorsque je me suis connecté à un serveur Jupyter distant avec VScode, il était distant mais local.
[Python] Comment créer un environnement de serveur Web local avec SimpleHTTPServer et CGIHTTPServer
Démarrez un serveur http temporaire localement avec Pytest
Configurer Golang avec goenv sur GNU / Linux
Démarrez un serveur Web Python simple avec Docker
Serveur de jeu avec deux PC
Lancer un serveur Web avec Python et Flask
Configurer un environnement de développement Python sur Marvericks
Monter le répertoire d'un autre serveur avec sshfs
Créer un serveur "Hello World" (HTTP) dans Tornado
Comment préparer l'environnement pour Google Colab avec le cours avancé d'apprentissage automatique de Coursera
Créez des serveurs sur Linux et des réseaux locaux avec Raspberry Pi NextCloud et le partage de bureau
Je veux configurer un serveur fictif pour python-flask en quelques secondes en utilisant swagger-codegen.
Configurer un serveur de fichiers utilisant la samba avec ZeroPi de Friendly Arm [Articles achetés]
Configurer un serveur de fichiers utilisant la samba avec ZeroPi de Friendly Arm [Importation personnelle]
Créer un serveur local GIF animé avec Python + Flask
Mettre en place un environnement de développement pour le traitement du langage naturel
Comment configurer un environnement Python à l'aide de pyenv
J'ai créé un serveur syslog prêt à l'emploi avec Play with Docker
Une histoire qui a eu du mal avec l'ensemble commun HTTP_PROXY = ~
Configurer Docker sur Oracle Linux (7.x) avec Vagrant
Un serveur qui fait écho aux données POSTées avec flask / python
Créez un serveur de musique domestique avec Centos8 + Universal Media Server
[Python] J'ai essayé d'exécuter un serveur local en utilisant flask