2017-05-25 10 views
1

Alamofire Libを使用して複数の画像をサーバーにアップロードしたい場合は、アップロードする画像1のみを使用します。スイフトマルチイメージをPHPサーバにアップロード

@IBAction func uploadimages(_ sender: Any) { 
     Alamofire.upload(
      multipartFormData: { multipartFormData in 
       for img in self.imagesdata{ 
       let imgdata = UIImageJPEGRepresentation(img, 1.0) 
        multipartFormData.append(imgdata!,withName: "image", fileName: "image.jpg", mimeType: "image/jpeg") 
        print("$$$$$$$$$$ : \(imgdata!)") 
       } 
      }, 
      to: "http://localhost/maarathtest/MAPI/img_upload.php", 
      encodingCompletion: { encodingResult in 
       switch encodingResult { 
       case .success(let upload, _, _): 
        upload.responseJSON { response in 
         debugPrint(response) 
        } 
       case .failure(let encodingError): 
        print(encodingError) 
       } 
     } 
     ) 


    } 

と私のPHP:

私は

imagesdata

命名されUIImageの配列を返すイメージピッカーをこれが私のコードされて使用しています

<?php 


$response = array(); 
if (empty($_FILES["image"])) { 

    $response['File'] = "NOFILE";; 


}else { 

    $filename = uniqid() . ".jpg"; 
    // If the server can move the temporary uploaded file to the server 
    if (move_uploaded_file($_FILES['image']['tmp_name'], "images/" . $filename)) { 

     $response['status'] = "Success"; 
     $response['filepath'] = "https://serverName/MAPI/images/" . $filename; 


} else{ 

    $response['status'] = "Failure"; 

    } 
} 



echo json_encode($response); 
?> 

私のコンソールログ:

$$$$$$$$$$ : 5849743 bytes 
$$$$$$$$$$ : 3253337 bytes 
[Request]: POST http://localhost/maarathtest/MAPI/img_upload.php 
[Response]: <NSHTTPURLResponse: 0x600000620940> { URL: http://localhost/maarathtest/MAPI/img_upload.php } { status code: 200, headers { 
    Connection = "Keep-Alive"; 
    "Content-Length" = 101; 
    "Content-Type" = "text/html"; 
    Date = "Thu, 25 May 2017 10:08:08 GMT"; 
    "Keep-Alive" = "timeout=5, max=100"; 
    Server = "Apache/2.4.18 (Unix) OpenSSL/1.0.2h PHP/5.5.35 mod_perl/2.0.8-dev Perl/v5.16.3"; 
    "X-Powered-By" = "PHP/5.5.35"; 
} } 
[Data]: 101 bytes 
[Result]: SUCCESS: { 
    filepath = "https://serverName/MAPI/images/5926ad083b770.jpg"; 
    status = Success; 
} 

UPDATE:

、私は今、そのイメージをアップロードし、以下のように

Alamofire.upload(
      multipartFormData: { multipartFormData in 
       var count = 1 
       for img in self.imagesdata{ 
       let imgdata = UIImageJPEGRepresentation(img, 1.0) 
       multipartFormData.append(imgdata!,withName: "image\(count)", fileName: "image\(count).jpg", mimeType: "image/jpeg") 
       count += 1 

     } 

     },... 



<?php 


$response = array(); 
if (empty($_FILES["image1"])) { 

    $response['File1'] = "NOFILE"; 


}else { 

    $filename = uniqid() . ".jpg"; 
    // If the server can move the temporary uploaded file to the server 
    if (move_uploaded_file($_FILES['image1']['tmp_name'], "images/" . $filename)) { 

     $response['status1'] = "Success"; 
     $response['filepath1'] = "https://serverName/MAPI/images/" . $filename; 


} else{ 

    $response['status1'] = "Failure"; 

    } 
} 

if (empty($_FILES["image2"])) { 

    $response['File2'] = "NOFILE"; 


}else { 

    $filename = uniqid() . ".jpg"; 
    // If the server can move the temporary uploaded file to the server 
    if (move_uploaded_file($_FILES['image2']['tmp_name'], "images/" . $filename)) { 

     $response['status2'] = "Success"; 
     $response['filepath2'] = "https://serverName/MAPI/images/" . $filename; 


} else{ 

    $response['status2'] = "Failure"; 

    } 
} 

echo json_encode($response); 
?> 

を自分のコードを変更しましたが、私は、これはそれを行うための適切な方法だとは思いませんユーザーがアップロードしたい画像の数がわからないからです!

任意のアイデア、ヘルプ、コードの最適化は非常に高度な

+0

これをチェックしてください - https://stackoverflow.com/a/40907477/5172413 –

+0

私はPHPのファイル数とその常時チェックしました。 '$ response [" count "] = count($) _FILES ['image'] ['name']); ' –

+0

各画像ファイルを別々の変数で受け取る必要があります。以下のような $ _FILES [ 'イメージ1']、 $ _FILES [ '画像2']、& $ _FILES [ '画像3'] OR あなたは画像の配列を送信すると、あなたは、コードを共有できる同じ –

答えて

0

おかげサーバーに複数の画像をアップロードするコードの下にこれを使用することをいただければ幸いです。私はこれを、NSMutableArrayUIImageオブジェクトとそれに対応する別の配列の名前を取るメソッドに入れました。必要に応じてNSMutableArrayをSwift Arrayに変更することができます。アップロードが成功した後、完了ハンドラが呼び出されますし、あなたの応答に基づいてマッピングされたオブジェクトを返します:

コード:私は問題を解決した

public func executeMultipleImageUpload<T: Mappable>(type: T.Type, url: String, parameters: Dictionary<String, String>, images: NSMutableArray?, names: [String], view: UIView, completion: @escaping(_ result: DataResponse<T>?)-> Void) { 

    //Calling Alamofire Upload method here... 

    Alamofire.upload(multipartFormData: { multipartFormData in // This is first param, the part data itself 

     if images == nil || images?.count == 0 { 

      print("There are no images to upload..!!") 

     } else { 

      //Append image data from array of images to multipart form data 

      var count = 1 
      for image in images! { 

       if let imageData = UIImageJPEGRepresentation(image as! UIImage, 0.76) { 

        multipartFormData.append(imageData, withName: names[count - 1], fileName: names[count - 1], mimeType: "image/jpeg") 
       } 

       count += 1 

      } 

     } 

     //We are encoding the parameters to be sent here in the multipart as well.. 

     for (key, value) in parameters { 

      multipartFormData.append((value.data(using: .utf8))!, withName: key) 

     }}, to: url, method: .post, headers: ["": ""], //This is second param (to:) 
     encodingCompletion: { encodingResult in // This is third param (encodingCompletion:) 

      switch encodingResult { 

      case .success(let upload, _, _): 

       upload.response { [weak self] response in 

        guard self != nil else { 

         return 
        } 

        debugPrint(response) 

        }.validate().responseObject{ 

         (response: DataResponse<T>) in 

          completion(response) 


       } 

      case .failure(let encodingError): 

       print("error:\(encodingError)") 

      } 

    }) 

} 
+0

あなたのコードによると、画像名は** multipartFormData **に追加する際に変更する必要があるので、私のPHPスクリプトでファイル名を受け取るにはどうすればいいですか?空($ _ファイル["image"])){'これは動作しません –

+0

私は本当に混乱しています、私は1つだけの画像をアップロードしていますか?または1つのファイルのみを処理している私のPHPコードですか? –

+0

私はバックエンド開発者ではありませんので、あなたのPHPコードはわかりませんが、AlamoFireコードは複数の画像で問題ないと思われます。バックエンドコードで確認する必要があるかもしれません。私のAlamoFireコードも同じですが、画像とともに他のパラメータも含まれています。 –

0

は、以下のコードは、いくつかの1

を助けるために願っています

スウィフト:

@IBAction func uploadimages(_ sender: Any) { 


     Alamofire.upload(
      multipartFormData: { multipartFormData in 
       var count = 1 
       for img in self.imagesdata{ 
       let imgdata = UIImageJPEGRepresentation(img, 0.5) 
        // the name should be as array other wise want work 
       multipartFormData.append(imgdata!,withName: "image[]", fileName: "image\(count).jpg", mimeType: "image/jpeg") 
       count += 1 

     } 

     }, 
      to: "http://localhost/maarathtest/MAPI/img_upload.php", 

      encodingCompletion: { encodingResult in 
       switch encodingResult { 
       case .success(let upload, _, _): 
        upload.responseJSON { response in 
         debugPrint(response) 
        } 
       case .failure(let encodingError): 
        print(encodingError) 
       } 
     } 
     ) 

    } 

PHPコードサンプル:

<?php 


$response = array(); 
if (empty($_FILES["image"])) { 

    $response['File1'] = "NOFILE"; 

}else { 

    //$filename = uniqid() . ".jpg"; 

    // loop through files array from IOS app 
    foreach ($_FILES["image"]["tmp_name"] as $index => $tmp_name) { 
    $filePath = "images/" . basename($_FILES["image"]["name"][$index]); 
    if (move_uploaded_file($tmp_name, $filePath)) { 

     // Images are stored in file path , do what ever is needed 

     $response['filepath'][$index] = $filePath; 
    } 
      $response['status'] = "Success"; 

} 

} 

echo json_encode($response); 
?> 
関連する問題