使用 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 未发布