Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将图像文件获取到body参数中_Php_Swift_Alamofire - Fatal编程技术网

Php 将图像文件获取到body参数中

Php 将图像文件获取到body参数中,php,swift,alamofire,Php,Swift,Alamofire,我正在尝试将文件上载到服务器。我在后端代码中使用SlimFramework和PHP,它是RESTful格式的。如果我通过邮递员上传,图像上传效果非常好,但是我无法使用Swift和Alamofire库让它工作 在后端的路由中,我从body参数获得如下文件: $image=$request->getUploadedFiles() 要上传,我使用: $image->moveTo(“myPath”) 在Swift中,我有一个路由器,它提供了.post方法和路由URL,我尝试如下: func upload

我正在尝试将文件上载到服务器。我在后端代码中使用SlimFramework和PHP,它是RESTful格式的。如果我通过邮递员上传,图像上传效果非常好,但是我无法使用Swift和Alamofire库让它工作

在后端的路由中,我从body参数获得如下文件:

$image=$request->getUploadedFiles()

要上传,我使用:

$image->moveTo(“myPath”)

在Swift中,我有一个路由器,它提供了
.post
方法和路由URL,我尝试如下:

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
    }
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")
                }
            }
        }
    }
let chosenProfileImage = info[UIImagePickerControllerEditedImage] as! UIImage
let imageData = UIImageJPEGRepresentation(chosenProfileImage, 0.2)
profileImageView.image = chosenProfileImage

let base64String = imageData?.base64EncodedString(options: .lineLength64Characters)
这是我的后端路线:

 $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,但服务器没有告诉我任何关于它的信息。问题一定出在快速部分。所以我甚至不知道如何调试它


我该如何解决这个问题?

我解决了这个问题。我是这样重建的:

  • 在客户端上将图像转换为Base64字符串
  • 在后端将其解码为图像
  • 上传
  • 因此,在Swift中,我将其转换为:

    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
        }
    
    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")
                    }
                }
            }
        }
    
    let chosenProfileImage = info[UIImagePickerControllerEditedImage] as! UIImage
    let imageData = UIImageJPEGRepresentation(chosenProfileImage, 0.2)
    profileImageView.image = chosenProfileImage
    
    let base64String = imageData?.base64EncodedString(options: .lineLength64Characters)
    

    后端基本相同,只是使用
    base64_decode()将其转换回文件并使用
    文件内容()功能将其移动到服务器。

    您正在将参数中“newfile”键的值设置为保存文件内容而不是文件实际内容的数据对象。你就是这个意思吗?Router.imageUpload有什么作用?@Scotthompson the Router.imageUpload只返回.post方法和端点url,它处理授权部分。如果图像可能变大,请使用多部分。