【问题标题】:Getting image file into body parameter将图像文件放入正文参数
【发布时间】:2017-10-01 21:57:50
【问题描述】:

我正在尝试将文件上传到服务器。我在后端代码中使用 SlimFramework 和 PHP,它是 RESTful 形式的。如果我通过 Postman 上传图片上传效果很好,但是我无法使用 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")
                }
            }
        }
    }

这是我的后端路由:

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

我应该如何解决这个问题?

【问题讨论】:

  • 您将参数中“newfile”键的值设置为保存文件内容而不是文件实际内容的数据对象。这就是你的意思吗? Router.imageUpload 是做什么的?
  • @ScottThompson Router.imageUpload 只返回 .post 方法和端点 url 并处理授权部分。

标签: php swift alamofire


【解决方案1】:

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

  1. 在客户端将图片转换为 Base64 字符串
  2. 在后端将其解码为图像
  3. 上传

所以在 Swift 中我是这样转换的:

let chosenProfileImage = info[UIImagePickerControllerEditedImage] as! UIImage
let imageData = UIImageJPEGRepresentation(chosenProfileImage, 0.2)
profileImageView.image = chosenProfileImage

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

后端几乎相同,只是使用base64_decode();将其转换回文件并使用file_put_contents();函数将其移动到服务器。

【讨论】:

  • 如果您的图像可以变大,请使用多部分。
猜你喜欢
  • 2011-07-19
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2012-05-17
  • 2021-10-02
  • 2016-04-01
相关资源
最近更新 更多