2017-05-03 32 views
10

मैं सर्वर पर फ़ाइल अपलोड करने का प्रयास कर रहा हूं। मैं अपने बैकएंड कोड में स्लिमफ्रेमवर्क और PHP का उपयोग कर रहा हूं और यह रीस्टफुल फॉर्म में है। अगर मैं इसे पोस्टमैन के माध्यम से अपलोड करता हूं तो छवि अपलोडिंग बहुत अच्छी तरह से काम करती है, हालांकि मैं इसे स्विफ्ट और अलामोफायर लाइब्रेरी का उपयोग करके काम करने में सक्षम नहीं हूं।शरीर पैरामीटर में छवि फ़ाइल प्राप्त करना

मार्ग मैं बैकएंड में है में, मैं इस तरह फ़ाइल मिलता है, शरीर पैरामीटर से:

$image->moveTo("myPath");

स्विफ्ट में:

$image = $request->getUploadedFiles();

और अपलोड करने के लिए मैं का उपयोग मेरे पास राउटर है, जो .post विधि और मार्ग यूआरएल देता है और मैंने इस तरह कोशिश की:

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 
    } 

और मैं इसे इस तरह कहते हैं:

$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)); 

    }); 

अजीब बात यह है कि Alamofire स्थिति कोड 500 आउटपुट लेकिन सर्वर ने मुझे इसके बारे में कुछ भी नहीं है नहीं बताया है:

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") 
       } 
      } 
     } 
    } 

यह मेरा बैकएंड मार्ग है । समस्या स्विफ्ट भाग में होना चाहिए। इसलिए मुझे यह नहीं पता कि इसे कैसे डिबग करना है।

मुझे समस्या का समाधान कैसे करना चाहिए?

+0

आप डेटा ऑब्जेक्ट में पैरामीटर में "newfile" कुंजी का मान सेट कर रहे हैं जिसमें फ़ाइल की वास्तविक सामग्री के बजाय फ़ाइल की सामग्री है। क्या आप यही करना चाहते हैं? Router.imageUpload क्या करता है? –

+0

@ScottThompson Router.imageUpload बस देता है। पोस्ट विधि और एंडपॉइंट यूआरएल और यह प्राधिकरण भाग को संभालता है। –

उत्तर

9

मैंने समस्या हल की। ग्राहक पर Base64 स्ट्रिंग को

  1. Convert छवि
  2. डिकोड यह बैकएंड पर छवि के लिए
  3. यह अपलोड

तो स्विफ्ट में मैं इसे इस तरह कन्वर्ट:

मैं इसे इस तरह से फिर से बनाया
let chosenProfileImage = info[UIImagePickerControllerEditedImage] as! UIImage 
let imageData = UIImageJPEGRepresentation(chosenProfileImage, 0.2) 
profileImageView.image = chosenProfileImage 

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

और बैकएंड काफी समान है, इसे base64_decode(); का उपयोग करके फ़ाइल में वापस परिवर्तित कर दिया औरका उपयोग कियाइसे सर्वर पर ले जाने के लिए फ़ंक्शन।

+0

यदि आपकी छवि आकार में बड़ी हो सकती है तो बहु भाग का उपयोग करें। – hemant3370

संबंधित मुद्दे