作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
将视频上传到 Vimeo 的过程开始时与为 Youtube 定义的过程非常相似,但仅在一定程度上有所不同。下面我将描述有效的步骤,并概述无效的最后一个视频上传步骤:
当我们传递以下参数以触发用户身份验证时,Vimeo 上传舞蹈开始:
let authPath:String = "\(url_vauth)?response_type=\(response_type)&client_id=\(client_id)&redirect_uri=\(redirect_uri)&state=\(state)&scope=upload"
if let authURL:NSURL = NSURL(string: authPath) {
let request = NSURLRequest(URL: authURL)
webView.loadRequest(request) // opens a webpage in a webUIView
// once credentials are entered, google redirects back with the above uri + a temporary code
// we will exchange later for a token
// within AppDelegate, we have defined a way to handle this uri, which is to call
// processOAuthStep1Response(url)
然后,我们处理返回的响应以提取授权码:
let components = NSURLComponents(URL: url, resolvingAgainstBaseURL: false)
var auth_code:String!
// the block below extracts the text that follows "code" in the return url
if let queryItems = components?.queryItems {
for queryItem in queryItems { // step through each part of url
if queryItem.name.lowercaseString == "code" {
auth_code = queryItem.value
break
} // end of if queryItem.name.lowercaseString
} // end of for
} // if let queryItems
有了这个授权码,我们就可以生成一个 token :
let getTokenPath:String = url_token
let grant_type = "authorization_code"
let header_plain = "\(client_id):\(client_secret)"
let string_plain = header_plain.dataUsingEncoding(NSUTF8StringEncoding)
let string_base64 = (string_plain?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)))! as String
let headers = ["Authorization": "basic \(string_base64)"] // note that string_base64 really needs to be in base64!
//print ("...header is: \(string_base64)")
let tokenParams = ["grant_type": grant_type, "code": receivedCode, "redirect_uri": redirect_uri, "scope": "public"]
let request = Alamofire.request(.POST, getTokenPath, parameters: tokenParams, encoding: .URL, headers: headers)
我们使用此 token 生成票:
request(.POST, url_getticket, parameters: ticketParams , encoding: .URL, headers: headers).responseJSON { response in
//print(response)
switch response.result {
case .Success(let data):
let json = JSON(data)
print (json)
let myticket = json["ticket_id"].stringValue
//let usage = json[("upload_quota")].stringValue
let htmlform = json[("form")].stringValue
let uploadlink = json[("upload_link_secure")].stringValue
print("......ticket is \(myticket)")
print("......form is \(htmlform)")
print("......upload link is \(uploadlink)")
case .Failure(let error):
print("Request failed with error: \(error)")
} // end of switch
最后(这就是事情戛然而止的地方)我们应该使用这张票证向 Vimeo 发出 POST 请求。问题是这张票嵌入在一个 html 表单中,该表单实际上向 Vimeo 发出上传请求......对于我试图实现它的 iOS 平台来说不是很有用。理想情况下,我想通过像这样的上传调用使用 Alamofire 实现:
let headers = ["Authorization": "Bearer \(token)"]
upload(
.POST,
"https://1511923767.cloud.vimeo.com/upload?ticket_id=#######&video_file_id=####&signature=####&v6=1&redirect_url=https%3A%2F%2Fvimeo.com%2Fupload%2Fapi%3Fvideo_file_id%3D498216063%26app_id%3D70020%26ticket_id%####%26signature%######",
headers: headers,
multipartFormData: { multipartFormData in
multipartFormData.appendBodyPart(data: videodata, name: "video", fileName: "bagsy.m4v", mimeType: "application/octet-stream")
},
encodingCompletion: { encodingResult in
switch encodingResult {
case .Success(let upload, _, _):
upload.progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in
dispatch_async(dispatch_get_main_queue()) {
let percent = (Float(totalBytesWritten) / Float(totalBytesExpectedToWrite))
//progress(percent: percent)
print ("................\(percent)")
}
}
upload.validate()
upload.responseJSON { response in
print(response)
callback(true)
}
case .Failure(_):
callback(false)
}
})
不用说,上面的代码块不起作用。任何指导将不胜感激。
最佳答案
考虑使用官方 Vimeo iOS Upload SDK .我们大约 2 周前将其公开。它是一个处理将视频文件上传到 Vimeo 服务器的 Swift 库。它使用后台配置的 NSURLSession 执行此操作(因此无论您的应用程序是在前台还是后台,上传都会继续)。有任何疑问,请告知我们。注意:我是图书馆的作者之一,我在 Vimeo 工作。
VimeoUpload自述文件非常强大,应该传达您需要知道的所有信息。 Lettuce 知道您是否还有其他问题,或者随时提出拉取请求。
关于swift - 将视频(和属性)上传到 vimeo 的 RESTful 机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36210781/
我是一名优秀的程序员,十分优秀!