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):
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
Wenn Sie den Wert auf Null (0) setzen, wird die Komprimierung maximiert. Vielleicht haben Sie also eine Dateigröße auf Ihrem Server? – rmp
@rmp oh richtig, danke dafür. Ich hatte keine Ahnung davon, ich benutze nur ein digitales Ozeankonto ... ich lese weiter dazu! – Sebastian