使用 URL swift Alamofire 上传视频

Posted

技术标签:

【中文标题】使用 URL swift Alamofire 上传视频【英文标题】:Uploading video using URL swift Alamofire 【发布时间】:2018-04-04 11:00:59 【问题描述】:

我需要使用 alamofire 将视频上传到服务器。用户选择视频,我在 didFinishPickingMediaWithInfo 中成功获取 URL,如下所示:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 
        picker.dismiss(animated: true, completion: nil)
        if let pickedVideo = info[UIImagePickerControllerMediaURL] as? URL 
            print(pickedVideo)
        
    

然后我使用以下代码上传视频:

Alamofire.upload( multipartFormData:  multipartFormData in
            multipartFormData.append(videoUrl, withName: "video", fileName: "video.mp4", mimeType: "video/mp4")

        , to: url, encodingCompletion:  encodingResult in
            switch encodingResult 
            case .success(let upload, _, _):
                upload.responseJSON  response in
                    if let JSON = response.result.value as? NSDictionary 
                        completion(true)
                     else 
                        completion(false)
                        print(response)
                    
                
            case .failure(let encodingError):
                print(encodingError)
                completion(false)
            
        )

进入失败块,显示如下错误:

multipartEncodingFailed(Alamofire.AFError.MultipartEncodingFailureReason.bodyPartFileNotReachableWithError(atURL: 文件:/private/var/mobile/Containers/Data/Application/C662AB0E-6A4F-40FB-9949-7F0A5AA2BA49/tmp/52C86F07-5DCC-413A-9F8C-71BBF33F793C.MOV -- file:///, error: Error Domain=NSCocoaErrorDomain Code=260 “文件“52C86F07-5DCC-413A-9F8C-71BBF33F793C.MOV”无法打开,因为 没有这样的文件。

【问题讨论】:

视频不能通过URL上传,转换成Data对象再上传。 向我们展示您创建videoUrl的代码 【参考方案1】:

您正在尝试通过URL上传视频,这是不可能的,在multipartFormData需要数据上传而不是URL,所以首先将其转换为Data然后上传。

仅对视频显示 imagePickerController 的功能:

func showImagePicker()
        let picker = UIImagePickerController()
        picker.delegate = self
        picker.mediaTypes = [kUTTypeMovie as String]
        self.present(picker, animated: true, completion: nil)
    

UIImagePickerControllerDelegate函数,选择视频后生效:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 
            picker.dismiss(animated: true, completion: nil)

            guard let videoUrl = info[UIImagePickerControllerMediaURL] as? URL else 
                return
            
            do 
                let data = try Data(contentsOf: videoUrl, options: .mappedIfSafe)
                print(data)
//  here you can see data bytes of selected video, this data object is upload to server by multipartFormData upload
             catch  
            
        

【讨论】:

显示信息为“文件“2C6D0E52-482B-4D8E-B3B7-F8B9CDF3E858.MOV”无法打开,因为没有该文件。” 是的,现在我正在将我的 url 转换为数据对象。 url转数据时,数据为nil。我认为 url 没有正确生成 数据对象为空,所以我无法上传。 我认为 url 不正确,这就是为什么程序无法将 url 转换为数据对象,因此将数据对象返回为 nil。我得到这样一个网址:file:///private/var/mobile/Containers/Data/Application/B5BF6C95-3708-4A94-9485-0AE01F0AFF31/tmp/C81EE7B5-B8BA-4915-8851-FCD33B93703A.MOV【参考方案2】:

使用 Alamofire 5,您可以这样做将视频上传到服务器:

 import Alamofire

 func uploadVideo(videoUrl: URL)  // local video file path..
        let timestamp = NSDate().timeIntervalSince1970 // just for some random name.

        AF.upload(multipartFormData:  (multipartFormData) in
            multipartFormData.append(videoUrl, withName: "image", fileName: "\(timestamp).mp4", mimeType: "\(timestamp)/mp4")
        , to: endPoint!  ).responseJSON  (response) in
            debugPrint(response)
        
    

注意:endPoint 是一个字符串。示例:http://172.10.3.7:5000/uploadvideo

【讨论】:

【参考方案3】:

.responseJSON 已贬值 改用 .responseData

示例: Update responseJSON to responseDecodable in Swift

【讨论】:

以上是关于使用 URL swift Alamofire 上传视频的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire(Swift 3):对成员“上传(..”)的模糊引用

在 iOS 9 问题上使用 Alamofire 上传带有 URL 参数的图像

Alamofire 4 swift 3 上传带有标题的 MultipartFormData 未发布

如何通过swift中的alamofire上传从手机中挑选的pdf和图像(任何一个选择的任何一个)文件

使用 Alamofire swift 4 上传文件

如何在swift中使用alamofire上传图库图片