2016-09-01 7 views
9

Ich versuche, 3 Bilder auf den Server von iOS zu meinem PHP-Dienst hochladen. Aus irgendeinem Grund bleibt der Ordner nach der Veröffentlichung leer, aber der Rest der Daten wird durch und bleibt in mysql erhalten.PHP-Upload von iOS mit Alamofire

Mein iOS Code:

Alamofire.upload(.POST, urlString, multipartFormData: { 
      multipartFormData in 

      if (firstPhoto != nil) { 
       if let firstImageData = UIImageJPEGRepresentation(firstImage!, 0.6) { 
        print("uploading image"); 
        multipartFormData.appendBodyPart(data: firstImageData, name: "firstImage", fileName: "firstImage.png", mimeType: "image/png") 
       } 
      } 

      if (secondPhoto != nil) { 
       if let secondImageData = UIImageJPEGRepresentation(secondImage!, 0.6) { 
        print("uploading image"); 
        multipartFormData.appendBodyPart(data: secondImageData, name: "secondImage", fileName: "secondImage.png", mimeType: "image/png") 
       } 
      } 

      if (thirdPhoto != nil) { 
       if let thirdImageData = UIImageJPEGRepresentation(thirdImage!, 0.6) { 
        print("uploading image"); 
        multipartFormData.appendBodyPart(data: thirdImageData, name: "thirdImage", fileName: "thirdImage.png", mimeType: "image/png") 
       } 
      } 


      if let imageData = UIImageJPEGRepresentation(firstImage!, 0.6) { 
       print("uploading image"); 
       multipartFormData.appendBodyPart(data: imageData, name: "image", fileName: "file.png", mimeType: "image/png") 
      } 

      if let imageData = UIImageJPEGRepresentation(firstImage!, 0.6) { 
       print("uploading image"); 
       multipartFormData.appendBodyPart(data: imageData, name: "image", fileName: "file.png", mimeType: "image/png") 
      } 


      for (key, value) in parameters { 
       multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key) 
      } 

      }, encodingCompletion: { 
       encodingResult in 

       switch encodingResult { 
       case .Success(let upload, _, _): 
        print("Запрос отправлен") 
        upload.responseJSON { response in 
         print(response.request) // original URL request 
         print(response.response) // URL response 
         print(response.data)  // server data 
         print(response.result) // result of response serialization 

         if let JSON = response.result.value { 
          print("JSON: \(JSON)") 
         } 
         completion(response.result.value) 
        } 

       case .Failure(let encodingError): 
        print(encodingError) 
        completion(nil) 
       } 
     }) 

} 

Auf meinem PHP bin ich nicht sicher, ob ich etwas fehlt hier bin:

<?php 

require_once 'Functions/common_functions.php'; 
require_once 'Functions/engine.php'; 
require_once 'Functions/json.php'; 
require_once 'Functions/check_token.php'; 

if (count($_REQUEST) == 6) { 
    foreach($_REQUEST as $k => $v) { 
     if (strlen($k) > 0 && strlen($v) > 0) { 
      $_REQUEST[$mysqli->real_escape_string($k)] = $mysqli->real_escape_string($v); 
     } else { 
      die(errorJSON("Empty parameter", "666")); 
     } 
    } 

    $userID = checkAccessToken($_REQUEST['access_token'], $mysqli); 

    if ($userID == 0) { 
     die(errorJSON("Incorrect access token", "666")); 
    } 

    $mysqli->query('INSERT INTO Book (title, authorID, detail, price, categoryID, conditionText) VALUES ("'.$_REQUEST['title'].'", "'.$userID.'", "'.$_REQUEST['detail'].'", "'.$_REQUEST['price'].'", "'.$_REQUEST['categoryID'].'", "'.$_REQUEST['condition'].'")'); 

    $insertID = $mysqli->insert_id; 

    if ($insertID > 0) { 
     savePhotos($mysqli, $insertID); 
     $message = book($insertID, $userID, $mysqli); 
     die(successJSON($message)); 
    } else { 
     die(errorJSON("Failed insert book in database", "666")); 
    } 
} else { 
    die(errorJSON("Incorrect count of parameter" . count($REQUEST) . count($_POST), "666")); 
} 

function savePhotos($mysqli, $bookID) { 
    if(!is_dir('/home/thebakpa/resources/book_photos/')) { 
     mkdir('/home/thebakpa/resources/book_photos/', 0777, true); 
    } 
    try { 
     $uploaddir = '/home/thebakpa/resources/book_photos/'; 
     $file = $_FILES['userfile']['photo1']; 

     if ($file != 0) { 
      $uploadfile = $uploaddir . $file; 

      $name = "photo1-".$bookID; 
      $photoPath = '/home/thebakpa/resources/book_photos/'.$name.'.jpg'; 

      $mysqli->query('UPDATE Book SET photo1='.$photoPath.' WHERE bookID='.$bookID.''); 
      move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile); 
     } 

     $file = $_FILES['userfile']['photo2']; 

     if ($file != 0) { 
      $uploadfile = $uploaddir . $file; 

      $name = "photo2-".$bookID; 
      $photoPath = '/home/thebakpa/resources/book_photos/'.$name.'.jpg'; 

      $mysqli->query('UPDATE Book SET photo1='.$photoPath.' WHERE bookID='.$bookID.''); 
      move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile); 
     } 

     $file = $_FILES['userfile']['photo3']; 

     if ($file != 0) { 
      $uploadfile = $uploaddir . $file; 

      $name = "photo3-".$bookID; 
      $photoPath = '/home/thebakpa/resources/book_photos/'.$name.'.jpg'; 

      $mysqli->query('UPDATE Book SET photo1='.$photoPath.' WHERE bookID='.$bookID.''); 
      move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile); 
     } 
    } catch(Exception $ex){ 
     echo "ERROR:".$ex->GetMessage()."\n"; 
     exit(1); 
    } 
} 
?> 
+0

Ich mag diese Frage wirklich. Ich fand es nur noch 35 Minuten auf dem Bounty-Timer. Ich bemerke, dass keine deiner Antworten eine höhere Stimme hat. Bitte benachrichtige mich, wenn es wieder für Bounty geht und nicht gelöst ist. Ich möchte mit etwas mehr Zeit eine Lösung für Ihren geposteten Code erstellen. Sollte hinzufügen, werde ich ohne Kopfgeld lösen. –

+1

Ich glaube, der Benutzer hat die Frage zu dieser Frage nicht aktiv. Weil meine Antwort korrekt ist und ich auch mit Beispielcode versucht habe, aber keine Antwort. –

+0

Cool Ich habe gerade deine gelesen. Ich wählte es früher ... aber dann stoppte ich mich, weil ich es nicht getestet hatte. Ich gebe dir die Abstimmung;) Sieht richtig aus. –

Antwort

5

Problem ist in Ihrer savePhotos-Funktion von PHP-Quelle. Auch einige zusätzliche Code in iOS-Code geschrieben. Ich habe extra Code entfernt. Versuch es einmal.

ist der iOS-Code

Alamofire.upload(.POST, urlString, multipartFormData: { 
     multipartFormData in 

     if (firstPhoto != nil) { 
      if let firstImageData = UIImagePNGRepresentation(firstImage!, 0.6) { 
       print("uploading image"); 
       multipartFormData.appendBodyPart(data: firstImageData, name: "firstImage", fileName: "firstImage.png", mimeType: "image/png") 
      } 
     } 

     if (secondPhoto != nil) { 
      if let secondImageData = UIImagePNGRepresentation(secondImage!, 0.6) { 
       print("uploading image"); 
       multipartFormData.appendBodyPart(data: secondImageData, name: "secondImage", fileName: "secondImage.png", mimeType: "image/png") 
      } 
     } 

     if (thirdPhoto != nil) { 
      if let thirdImageData = UIImagePNGRepresentation(thirdImage!, 0.6) { 
       print("uploading image"); 
       multipartFormData.appendBodyPart(data: thirdImageData, name: "thirdImage", fileName: "thirdImage.png", mimeType: "image/png") 
      } 
     } 

     for (key, value) in parameters { 
      multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key) 
     } 

     }, encodingCompletion: { 
      encodingResult in 

      switch encodingResult { 
      case .Success(let upload, _, _): 
       print("Запрос отправлен") 
       upload.responseJSON { response in 
        print(response.request) // original URL request 
        print(response.response) // URL response 
        print(response.data)  // server data 
        print(response.result) // result of response serialization 

        if let JSON = response.result.value { 
         print("JSON: \(JSON)") 
        } 
        completion(response.result.value) 
       } 

      case .Failure(let encodingError): 
       print(encodingError) 
       completion(nil) 
      } 
    }) 

} 

aktualisiert und hier ist der Code PHP

function savePhotos($mysqli, $bookID) { 
    $basePath = '/home/thebakpa/resources/book_photos/' 
    if(!is_dir($basePath)) { 
     mkdir($basePath, 0777, true); 
    } 
    try { 
     $file1 = $_FILES['firstImage']; 

     if (is_uploaded_file($file1['tmp_name'])) { 
      $photoPath = $basePath.'photo1-'.$bookID.'.jpg'; 

      if (move_uploaded_file($file1['tmp_name'], $photoPath)) { 
       $mysqli->query('UPDATE Book SET photo1='.$photoPath.' WHERE bookID='.$bookID.''); 
      } 
     } 

     $file2 = $_FILES['secondImage']; 

     if (is_uploaded_file($file2['tmp_name'])) { 
      $photoPath = $basePath.'photo2-'.$bookID.'.jpg'; 

      if (move_uploaded_file($file2['tmp_name'], $photoPath)) { 
       $mysqli->query('UPDATE Book SET photo2='.$photoPath.' WHERE bookID='.$bookID.''); 
      } 
     } 

     $file3 = $_FILES['thirdImage']; 

     if (is_uploaded_file($file3['tmp_name'])) { 
      $photoPath = $basePath.'photo3-'.$bookID.'.jpg'; 

      if (move_uploaded_file($file3['tmp_name'], $photoPath)) { 
       $mysqli->query('UPDATE Book SET photo3='.$photoPath.' WHERE bookID='.$bookID.''); 
      } 
     } 
    } catch(Exception $ex){ 
     echo "ERROR:".$ex->GetMessage()."\n"; 
     exit(1); 
    } 
} 
+0

Vielen Dank – franklinexpress

+0

Willkommen ............ –

+0

'' 'if (! is_dir ($ basePath)) {' '' Parse Fehler hier, kann ignoriert werden? – franklinexpress

1

Die Namen stimmen nicht überein ['userfile']['photo1'] in Ihrer PHP. Aber auf der iOS-Seite userfile und photo1 werden nie verwendet. Versuchen Sie mit $_FILES['firstImage']

1

dies versuchen, wenn Sie Bild im JSON-Format einreichen (für andere Bilder gleichen Code wiederholen, indem Sie Bildnamen chnaging)

<?php  

      $image   = $file; 
      $directorypath1 = $uploaddir; 
      $img   = str_replace('data:image/PNG;base64,', '', $image); 
      $img   = str_replace(' ', '+', $img); 
      $data   = base64_decode($img); 
      $name   = rand() . '_' . time() . ".jpg"; 
      $img_path  = $directorypath1 . $name; 
      file_put_contents($img_path, $data); 

?>