2017-06-01 6 views
0

Ich habe Alamofire in meiner App verwendet, um Bilder über eine mehrteilige Formular-Upload-Anfrage hochzuladen. Dies funktionierte bis zu dem Punkt, an dem ich die JWT-Authentifizierung und einen Benutzer-Login-System in meine CakePHP 3-REST-API nach this documentation. implementiert hatte. Vor diesem Zeitpunkt, als es funktionierte, war es absolut in Ordnung. Der Upload wäre ein Erfolg, würde in meiner Datenbank eingetragen werden und Sie könnten die Image-Dateien auf dem Server sehen (via Filezilla). Dieses System zum Hochladen von Bildern funktioniert nicht mehr, nachdem ich das Anmeldesystem mit JWT-Authentifizierung erfolgreich implementiert und es gerade geschafft habe, dies jetzt zu beheben. Das Problem, das ich habe, ist jedoch, dass die Upload-Anfrage erfolgreich ist, aber nur die Bilddateinamen in meiner Datenbank gefüllt werden und ich die Bilddateien auf meinem Server in Filezilla nicht sehen kann, was wirklich seltsam ist. Kann mir jemand in die richtige Richtung zeigen, oder hat jemand dieses Problem schon einmal gehabt? Es kommt in meinem Konsolenprotokoll als Erfolg zurück, also sollte es in der Theorie funktionieren.Verwenden von Alamofire zum Hochladen von Bildern auf einen Server

Hier ist mein Swift Code:

import UIKit 
import Foundation 
import Alamofire 
import SwiftyJSON 

class UploadImageController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

var selectedImage: UIImage? 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

@IBOutlet weak var myImageView: UIImageView! 


override func viewDidAppear(_ animated: Bool) { 

    if selectedImage == nil { 
     let imagePicker = UIImagePickerController() 
     imagePicker.delegate = self 
     imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary 
     imagePicker.allowsEditing = false 


     self.present(imagePicker, animated: true) 
    } 
} 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo: [String : Any]) { 
    guard let image = didFinishPickingMediaWithInfo[UIImagePickerControllerOriginalImage] as? UIImage else { return } 
    selectedImage = image 
    myImageView.image = image 
    self.dismiss(animated: true, completion: nil) 
} 

@IBAction func uploadButtonTapped(_ sender: UIButton) { 
    guard let image = myImageView.image else { return } 
    upload(image) 
} 

override func viewWillDisappear(_ animated: Bool) { 
    selectedImage = nil 
    myImageView.image = nil 
} 

func upload(_ image: UIImage) { 

    let parameters: [String: String] = [ 
     "artist_id": "1" 
    ] 

    let imageData = UIImageJPEGRepresentation(image, 1)! 


    Alamofire.upload(multipartFormData: { multipartFormData in 
     multipartFormData.append(imageData, withName: "upload", fileName: "upload.jpg", mimeType: "image/jpeg") 

     for (key, value) in parameters { 
      multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key) 
     } 

    }, to: "http://178.62.107.243/api/posts", 
     method:.post, 
     headers: ["Authorization": "Bearer \(Request.shared.token!)", 
     "Accept": "application/json", 
     "Content-Type": "application/json"], 
     encodingCompletion: { encodingResult in 
     switch encodingResult { 
     case .success(let upload, _, _): 
      upload.responseJSON { response in 
       debugPrint(response) 
      } 
     case .failure(let encodingError): 
      print(encodingError) 
     } 
    }) 

} 

} 

Hier ist meine PHP-Code:

<?php 
namespace App\Controller\Api; 
use App\Controller\Api\AppController; 
use Cake\Log\Log; 

class PostsController extends AppController 
{ 
public $paginate = [ 
    'page' => 1, 
    'limit' => 500, 
    'maxLimit' => 500, 
    'contain' => ['Artists'] 
]; 


public function add() { 

    $this->Crud->on('beforeSave', function(\Cake\Event\Event $event) { 

     if(!empty($this->request->data['upload']['name'])) { 

      $file = $this->request->data['upload']; 
      $ext = substr(strtolower(strrchr($file['name'], '.')), 1); //get the extension 

      $arr_ext = ['jpg', 'png']; //set allowed extensions 

      $newFileName = time() . "_" . rand(000000, 999999); 

      //only process if the extension is valid 
      if (in_array($ext, $arr_ext)) { 
       //do the actual uploading of the file. First arg is the tmp name, second arg is 
       //where we are putting it 
       move_uploaded_file($file['tmp_name'], WWW_ROOT . 'img/posts/' . $newFileName . '.' . $ext); 

       //prepare the filename for database entry 
       $imageFileName = $newFileName; 

       $event->subject->entity->file_name = $imageFileName; 

      } 


     } 

    }); 

    $this->Crud->execute(); 

} 

} 

Und hier sind die Upload-Anfragen, die ich in den letzten 20 Minuten durchgeführt haben (wenn dies auch hilft):

Database_posts table

+1

Ich habe herausgefunden, was das Problem war. Dies liegt daran, dass die Bilddaten, die durch UIImageJPEGRepresentation dargestellt werden, "0" sein müssen. Gefällt mir: last imageData = UIImageJPEGRepräsentation (Bild, 0)! Ich weiß nicht warum, aber es funktioniert! Jetzt werden die Bilddateien auf meinen Server hochgeladen. Wenn jemand weiß, warum der Wert Null sein muss, hinterlasse bitte einen Kommentar. – Sebastian

+1

Wenn Sie den Wert auf Null (0) setzen, wird die Komprimierung maximiert. Vielleicht haben Sie also eine Dateigröße auf Ihrem Server? – rmp

+0

@rmp oh richtig, danke dafür. Ich hatte keine Ahnung davon, ich benutze nur ein digitales Ozeankonto ... ich lese weiter dazu! – Sebastian

Antwort

0

Wenn ich mit mehrteiliger Formulare beschäftigen ich mag um den Schlüssel/Wert zu überprüfen, damit ich das Bild anders behandeln kann. Ich weiß nicht, ob das deine Probleme sind. Hier ist, wie ich es in der Regel behandeln:

// append parameters to request 
for (key, value) in object { 
    if value != nil{ 
     //image data 
     if value!.isKind(of: UIImage.self){ 
      // convert image to data and append to request 
      if let imageData = UIImageJPEGRepresentation(value as! UIImage, 1) { 
       multipartFormData.append(imageData, withName: key, fileName: "image.png", mimeType: "image/png") 
      } 
     } 
     //non-image data 
     else{ 
      let stringValue = String(describing: value!) 
      if let formData = stringValue.data(using: String.Encoding.utf8, allowLossyConversion: false){ 
       multipartFormData.append(formData, withName: key) 
      } 
     } 
    } 
    else{ 
     //no data for key (nil), don't send property 
    } 
} 
+0

das ist nicht das Problem. Danke für den Tipp :) – Sebastian

Verwandte Themen