2016-06-22 1 views
0

J'ai recherché d'autres solutions à cette question, mais je ne comprends pas très bien ce qu'elles font, et je n'arrive pas à faire fonctionner la mienne.Téléchargement d'une image depuis iOS/Swift vers le serveur PHP

Voici mon code rapide

let imageData = UIImageJPEGRepresentation(image, 1.0) 
if(imageData == nil) { return } 

let request = NSMutableURLRequest(URL: NSURL(string: ip)!) //ip is a string variable holding my correct ip address 
request.HTTPMethod = "POST" 
request.setValue("Keep-Alive", forHTTPHeaderField: "Connection") 
let postString = "id=\(id)&" 

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: NSOperationQueue.mainQueue()) 

let body = NSMutableData() 
body.appendData(postString.dataUsingEncoding(NSUTF8StringEncoding)!) 
body.appendData(imageData!) 

request.HTTPBody = body 


let task = session.uploadTaskWithRequest(request, fromData: imageData!) 
task.resume() 

Et voici mon fichier PHP

<?php 
if (move_uploaded_file($_FILES['file']['tmp_name'], "image.jpg")) { 
    echo "File uploaded: ".$_FILES["file"]["name"]; 
} 
else { 
    echo "File not uploaded"; 
} 
?> 

J'ai lu valide et un accès en écriture au fichier « image.jpg » qui se trouve sur le devant de mon serveur , mais il va encore dire qu'il ne pouvait pas télécharger le fichier. Des pensées?

Répondre

1

Vous soumettez l'image dans le cadre du corps de la demande POST. Il ne sera pas accessible en utilisant $_FILES.

Vous pouvez Base-64 encode les données d'image, envoyer la chaîne post "id=\(id)&image=\(base64EncodedImageData)", puis récupérer et décoder en utilisant $_POST.

Vous voudrez peut-être envisager d'utiliser une bibliothèque de mise en réseau comme Alamofire.

+0

$ img = $ _POST [ "image"]; alors quoi? Merci par la voie –

+0

@BL Utilisez 'base64_decode' de PHP pour récupérer l'image, puis faites ce que vous voulez avec. – Code

0

La méthode manuelle et non recommandée: Changez votre code PHP pour générer des réponses JSON. Mais comme mentionné, vous devriez laisser Alamofire faire cela pour vous. Vous pouvez utiliser MSProgress pour une mise à jour de la progression visuelle dans Alamofire.

enter image description here

let apiToken = "ABCDE" 
Alamofire.upload(
    .POST, 
    "http://sample.com/api/upload", 
    multipartFormData: { multipartFormData in 
     multipartFormData.appendBodyPart(data: imageData, name: "yourParamName", fileName: "imageFileName.jpg", mimeType: "image/jpeg") 
     multipartFormData.appendBodyPart(data: apiToken.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"api_token") 
     multipartFormData.appendBodyPart(data: otherBodyParamValue.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"otherBodyParamName") 
    }, 
    encodingCompletion: { encodingResult in 
     switch encodingResult { 
     case .Success(let upload, _, _): 
      upload.progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in 
       print("Uploading Avatar \(totalBytesWritten)/\(totalBytesExpectedToWrite)") 
       dispatch_async(dispatch_get_main_queue(),{ 
        /** 
        * Update UI Thread about the progress 
        */ 
       }) 
      } 
      upload.responseJSON { (JSON) in 
       dispatch_async(dispatch_get_main_queue(),{ 
        //Show Alert in UI 
        print("Avatar uploaded"); 
       }) 
      } 

     case .Failure(let encodingError): 
      //Show Alert in UI 
      print("Avatar uploaded"); 
     } 
    } 
);