通过 Alamofire 上传文件并使用 Slim PHP 在服务器端检索它

Posted

技术标签:

【中文标题】通过 Alamofire 上传文件并使用 Slim PHP 在服务器端检索它【英文标题】:Uploading files though Alamofire and retrieve it server side with Slim PHP 【发布时间】:2017-07-02 21:43:07 【问题描述】:

我尝试使用Alamofire (Link) (Swift 3.0) 解决有关文件上传的问题,并使用Slim php (Link) 微框架在服务器端检索它们。

我正在尝试使用

上传从 iPhone 拍摄的照片
Alamofire.upload(multipartFormData: 
multipartFormData in
    multipartFormData.append("value".data(/* ... */)!, withName :"key")

   var idx = 1;
   for imageRepresentation in imageData 
       let pictureName = "pictures[]"
       multipartFormData.append(imageRepresentation, withName: pictureName, mimeType: "image/jpeg")
       idx += 1
   

 ,
 to: uploadUrl,
 method:.post,
 headers: httpHeaders,
 encodingCompletion: /* ... */

在这里我几乎可以肯定这个脚本工作正常,因为当我点击https://httpbin.org/post 时,我会返回我上传的编码data base 64 图像,所以我很确定问题出在我的服务器端代码。

所以,正如我所说,我在这条路由中使用 Slim PHP (Link) 服务器端

$this->post('/upload', function ($request, $response, $args) 

        $request->getParsedBody(); //null
        $request->getQueryParams(); // []
        $request->getBody(); // 
        $request->getUploadedFiles(); // []

        return /*Some JSON */

    )->setName('upload');

我错过了什么吗?有什么我不明白的吗? 我已经试过了

Multipart/form-data example in slim micro framework https://akrabat.com/psr-7-file-uploads-in-slim-3/

最奇怪的是,当从 Paw API Explorer 中执行脚本时,它的工作原理就像一个魅力

任何帮助将不胜感激!谢谢。

【问题讨论】:

【参考方案1】:

用于上传从照片库中选择的图像

在 Swift 3 和 Alamofire 4 中

这里是如何使用 Alamofire 上传的完整实现

    将以下内容添加到您的 ViewController 类中:

    UIImagePickerControllerDelegateUINavigationControllerDelegate

    创建一个按钮:

首先创建一个按钮并在其中为选取器视图实现以下方法

@IBAction func btnSelectProfileImageClicked(_ sender: Any) 
    
    let ImagePicker = UIImagePickerController()
    ImagePicker.delegate = self
    ImagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
    
    self.present(ImagePicker, animated: true, completion: nil)
    
    

    然后实现以下 UIPicker 方法:

    func imagePickerController( _ picker: UIImagePickerController,didFinishPickingMediaWithInfo info:[String : Any] )
    Imgprofile.image = info[UIImagePickerControllerOriginalImage] as? UIImage
    self.dismiss(animated: true, completion: nil)
    

    制作另一个按钮,使用 Alamofire 将数据传递到 URL,并为其提供 @IBAction 出口:

输入以下数据

 @IBAction func btnUpdateProfileSelected(_ sender: Any) 
    
    Alamofire.upload(multipartFormData:  (multipartFormData) in
        multipartFormData.append(UIImageJPEGRepresentation(self.Imgprofile.image!, 1)!, withName: "Prescription", fileName: "Profile_Image.jpeg", mimeType: "image/jpeg")
    , to:" Your URL Here where You want to Upload")
     (result) in
        switch result 
        case .success(let upload, _, _):
            print(result)
            
            upload.uploadProgress(closure:  (progress) in
                print(progress)
            )
            
            upload.responseJSON  response in
                //print response.result
                print(response);
            
            
        case .failure(let encodingError):
            print(encodingError);
        
    

就是这样

希望对你有帮助

对于完整示例代码或任何疑问,请发表评论。我会为你提供 示例代码。其中包括获取以及 使用 Alamofire 上传数据。

谢谢

【讨论】:

我已经知道了。该问题位于 Alamofire 的 Content-type 关于文件上传的问题。

以上是关于通过 Alamofire 上传文件并使用 Slim PHP 在服务器端检索它的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 上传带有进度的大文件并在应用重启时显示进度

无法使用 Alamofire 通过服务器上传音频文件

通过 API 将带有 Alamofire 的 STL 文件上传到 Octoprint

Alamofire 从多个请求中取消一个请求

如何使用操作查询发出多个 Alamofire 请求

如何在 Alamofire 中上传文件并在参数中传递数据 - swift 5