2017-05-03 64 views
10

Dosyaya sunucu yüklemeye çalışıyorum. Arka uç kodumda SlimFramework ve PHP kullanıyorum ve RESTful formda. Postman üzerinden yüklediğimde, resim yüklemesi çok iyi çalışıyor ancak Swift ve Alamofire kitaplığını kullanarak çalışmam mümkün değil. Ben arka uç var rotada Resim dosyasını gövde parametresine alma

, ben vücut parametresinden böyle dosyayı almak: Swift ise

$image->moveTo("myPath");

:

$image = $request->getUploadedFiles();

ve yüklemek için kullandığım .post yöntemini ve yol URL'sini veren yönlendiricim var ve şu şekilde denedim:

func uploadImage(user_id: Int, image: Data, completion: @escaping (_ error: Error?, _ success: Bool)->Void) { 
     let parameters = [ 
      "user_id": user_id, 
      "newFile": image 
     ] as [String : Any] 

     Alamofire.request(Router.imageUplaod(parameters: parameters)) 
      .validate(statusCode: 200..<300) 
      .responseJSON { response in 

       switch response.result{ 

       case .failure(let error): 
        completion(error, false) 

        print(error) 

       case .success(let value): 
        //Registered sucesfully! let json = JSON(value) 
        completion(nil, true) 

       }//Switch case 
     }//Alamofire 
    } 

Ve böyle diyoruz:

$this->post('/image/upload', function($request, $response, $args){ 
    global $database; 
    $data = $request->getParsedBody(); 
    $user_id = $data['user_id']; 

    $files = $request->getUploadedFiles(); 
    if (empty($files['newfile'])) { 
     throw new Exception('Expected a newfile'); 
    } 

    $newfile = $files['newfile']; 

    if ($newfile->getError() === UPLOAD_ERR_OK) { 
    $uploadFileName = "profileImage".$user_id.".jpg"; 
    $newfile->moveTo("/path/to/image/$uploadFileName"); 
    } 

    $database->query("UPDATE `users` SET `profile_image_url` = :image WHERE user_id = :user_id"); 
    $database->bind(':image', $uploadFileName); 
    $database->bind(':user_id', $user_id); 
    $database->execute(); 


    $Jsonarray['status'] = "true"; 
    $Jsonarray['message'] = "Image Uploaded Successfully"; 
    return $response->withStatus(200)->withHeader('Content-Type', 'application/json')->write(json_encode($Jsonarray)); 

    }); 

garibi Alamofire durum kodu 500 verir ancak sunucu bana bu konuda bir şey söylemek kalmamasıdır:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     let chosenProfileImage = info[UIImagePickerControllerEditedImage] as! UIImage 
     let imageData = UIImageJPEGRepresentation(chosenProfileImage, 0.2) 
     profileImageView.image = chosenProfileImage 

     dismiss(animated: true) { 
      API.uploadImage(user_id: User.sharedInstance.user_id, image: imageData!) { (error, success) in 

       if success{ 
        print("IMAGE UPLOADDED") 
       } 
      } 
     } 
    } 

Bu benim arka uç yoldur . Sorun Swift bölümünde olmalı. Bu yüzden, nasıl hata ayıklanacağımı bile bilmiyorum.

Sorunu nasıl çözmeliyim?

+0

Parametrelerde "newfile" anahtarının değerini, dosyanın gerçek içeriğini değil, dosyanın içeriğini tutan bir veri nesnesine ayarlarsınız. Yapmak istediğin şey bu mu? Router.imageUpload ne yapar? –

+0

@ScottThompson Router.imageUpload sadece .post yöntemini ve son nokta URL'sini döndürür ve Yetkilendirme bölümünü ele alır. –

cevap

9

Sorunu çözdüm. istemci üzerinde Base64 String

  1. dönüştürme görüntü
  2. Decode o arka uçta görüntüye
  3. bunu yükle

Yani Swift ben bunu böyle dönüştürün:

o şekilde yeniden inşa
let chosenProfileImage = info[UIImagePickerControllerEditedImage] as! UIImage 
let imageData = UIImageJPEGRepresentation(chosenProfileImage, 0.2) 
profileImageView.image = chosenProfileImage 

let base64String = imageData?.base64EncodedString(options: .lineLength64Characters) 

Ve arka uç hemen hemen aynı, sadece base64_decode(); kullanarak dosyaya dönüştürüldü vekullanıldısunucuya taşımak için işlev.

+0

Görüntünüzün boyutu büyükse çok parçalı kullanın. – hemant3370