Configurer WebServer dans Go et télécharger des fichiers depuis l'application Android
PC Windows10 Android Studio 4.0 Kotlin 1.3.72 Émulateur de terminal Android (niveau d'API 29) Go 1.11.1
Envoyez un fichier depuis l'application Android, enregistrez-le côté serveur et renvoyez le code d'état du serveur à l'application
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
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>
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 )
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
}
}
Confirmez l'adresse IP du serveur (PC) auquel vous souhaitez accéder en exécutant ce qui suit avec l'invite de commande
>ipconfig
Définissez http: // {adresse IP confirmée}: 8080 dans requestUrl de Net # startConnection et exécutez l'application
Vérifiez le même répertoire que main.go sur votre PC Terminer si le fichier a été créé
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.
Téléchargement de fichier en langue Go
[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