Contenidos
Cliente creado en Swift para un iPhone
Permiso para acceder a la cámara (NSCameraUsageDescription)
Código del cliente que hace la foto y la envía al servidor
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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
import SwiftUI import UIKit struct ImagePicker: UIViewControllerRepresentable { @Binding var uiImage: UIImage? @Binding var showingImagePicker: Bool func makeCoordinator() -> Coordinator { Coordinator(self) } func makeUIViewController(context: Context) -> UIImagePickerController { let picker = UIImagePickerController() picker.delegate = context.coordinator picker.sourceType = .camera return picker } func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {} class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate { var parent: ImagePicker init(_ parent: ImagePicker) { self.parent = parent } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let uiImage = info[.originalImage] as? UIImage { parent.uiImage = uiImage } parent.showingImagePicker = false } } } struct ContentView: View { @State private var showingImagePicker = false @State private var uiImage: UIImage? = nil // Variable para almacenar la UIImage var body: some View { VStack { if let image = uiImage { Image(uiImage: image) // Mostrar la UIImage convertida si está disponible .resizable() .scaledToFit() .frame(width: 200, height: 200) } else { Image(systemName: "camera") // Mostrar un ícono de cámara si la imagen no está disponible .resizable() .scaledToFit() .frame(width: 200, height: 200) } Button("Tomar Foto") { self.showingImagePicker = true } .sheet(isPresented: $showingImagePicker, onDismiss: loadImage) { ImagePicker(uiImage: self.$uiImage, showingImagePicker: self.$showingImagePicker) } Button("Enviar Foto") { guard let selectedImage = uiImage else { print("No hay ninguna imagen seleccionada") return } sendPhotoToServer(selectedImage) } } } func loadImage() { // Implementar si se necesita procesamiento después de tomar la foto } func sendPhotoToServer(_ image: UIImage) { guard let imageData = image.jpegData(compressionQuality: 0.5) else { print("Error al convertir la imagen a datos.") return } let url = URL(string: "http://192.168.1.55:6000/upload-image")! // Reemplaza con la dirección del servidor var request = URLRequest(url: url) request.httpMethod = "POST" request.httpBody = imageData request.setValue("image/jpeg", forHTTPHeaderField: "Content-Type") URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { print("Error al enviar la imagen al servidor: \(error.localizedDescription)") return } if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 { print("Imagen enviada exitosamente.") // Handle success response from server if needed } }.resume() } } @main struct pruebaApp: App { var body: some Scene { WindowGroup { ContentView() } } } |
Servidor web creado en Kotlin que recibe la imagen
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 |
import io.ktor.application.* import io.ktor.http.content.* import io.ktor.request.* import io.ktor.response.* import io.ktor.routing.* import io.ktor.server.engine.* import io.ktor.server.netty.* import java.io.File fun main() { val server = embeddedServer(Netty, port = 6000) { routing { post("/upload-image") { val fileBytes = call.receive<ByteArray>() val fileName = "image.png" // Nombre del archivo y extensión val file = File(fileName) file.writeBytes(fileBytes) call.respond("1") print("File '$fileName' uploaded successfully.\n") } } } server.start(wait = true) } |