Swift上传视频到Http服务器?
我试图将视频上传到我的服务器。 我从相册中选择视频,但“致命错误:意外地发现零,同时展开可选值”。Swift上传视频到Http服务器?
请找到下面的代码以获取更多信息。
let videoURL: String = NSBundle.mainBundle().pathForResource("IMG_2859", ofType: "MOV")!
// var videoData: NSData = NSData.dataWithContentsOfURL(NSURL.fileURLWithPath(videoURL))!
print(videoURL)
let data = NSData(contentsOfFile: videoURL)
print(data)
let session = NSURLSession.sharedSession()
let request = NSMutableURLRequest()
print(session)
print(request)
request.URL = NSURL(string: "uploadvideo/uploadtoserver?user_email=\(candit_email)")
print(request.URL)
request.HTTPMethod = "POST"
let boundary = "------------------------8744f963ff229392"
request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
let postData = NSMutableData()
postData.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
print("Upload Video File1")
postData.appendData("Content-Disposition: form-data; name=\"filedata\"; filename=\"MOV\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
print("Upload Video File2")
postData.appendData("Content-Type: video/x-msvideo\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
print("Upload Video File3")
postData.appendData(NSData(data: data!))
print("Upload Video File4")
postData.appendData("\r\n--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
print("Upload Video File5")
request.HTTPBody = postData
print("Upload Video File6")
print(request.HTTPBody)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
let error: AutoreleasingUnsafeMutablePointer<NSError?> = nil
do{
if let jsonResult: NSDictionary! = try NSJSONSerialization.JSONObjectWithData(data!, options:NSJSONReadingOptions.MutableContainers) as? NSDictionary{
}
} catch let error as NSError {
print(error.localizedDescription)
}
})
}
我在下面提到了这两个链接,但对我没用。
1)Imageor-video-posting-to-server-in-swift
2)how-to-upload-video-to-server-from-iphone
尝试此。 它适合我。
首先定义一个NSURL变量。
var videoPath: NSURL? = nil
然后使用UIImagePickerControllerDelegate获取文件的信息。
extension ViewController: UIImagePickerControllerDelegate{
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
let mediaType = info[UIImagePickerControllerMediaType] as! NSString
// choose Video
if mediaType.isEqualToString(kUTTypeMovie as String) {
self.videoPath = info[UIImagePickerControllerMediaURL] as? NSURL
// Check the file path in here
print(self.videoPath!.relativePath)
}
self.dismissViewControllerAnimated(true, completion: nil)
}
}
这是上传事件方法:
// upload event
func uploadMedia(){
if videoPath == nil {
return
}
let url = NSURL(string: "server_path")
let request = NSMutableURLRequest(URL: url!)
let boundary = "------------------------your_boundary"
request.HTTPMethod = "POST"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
var movieData: NSData?
do {
movieData = try NSData(contentsOfFile: (videoPath?.relativePath)!, options: NSDataReadingOptions.DataReadingMappedAlways)
} catch _ {
movieData = nil
return
}
let body = NSMutableData()
// change file name whatever you want
let filename = "upload.mov"
let mimetype = "video/mov"
body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Disposition:form-data; name=\"file\"; filename=\"\(filename)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData("Content-Type: \(mimetype)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(movieData!)
request.HTTPBody = body
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) {
(
let data, let response, let error) in
guard let _:NSData = data, let _:NSURLResponse = response where error == nil else {
print("error")
return
}
let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print(dataString)
}
task.resume()
}
简单的方法将是使用上传的Alamofire文件。
首先使用的CocoaPods
安装Alamofire包括这在你的POD文件
荚 'Alamofire', '〜> 4.0'
然后到终端,改变ddirectory到项目,并进入
吊舱安装
现在
进口Alamofire
现在你必须得到你所想要上传到服务器
func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [String : Any])
{
if let videoUrl = info[UIImagePickerControllerMediaURL] as? URL
{
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(videoUrl, withName: "Video")
}, to:"http://yourserverpath.php")
{ (result) in
switch result {
case .success(let upload, _ , _):
upload.uploadProgress(closure: { (progress) in
print("uploding")
})
upload.responseJSON { response in
print("done")
}
case .failure(let encodingError):
print("failed")
print(encodingError)
}
}
self.dismiss(animated: true, completion: nil)
}
}
视频的路径,这个是PHP代码
<?php
$imgname=$_FILES['video']['name'];
$imgloc=$_FILES['video']['tmp_name'];
if(move_uploaded_file($imgloc,"upload/".$imgname)){
echo "success";
}
else{
echo "failed";
}
?>
的“urlvideo”是否有一种方法可以使用类似下面的方法来测试'.php':curl --upload-file file.jpg --url http:// remote_server_ip_addr/php_code_file.php'? – sAguinaga
尝试使用Alamofire,这是一个容易得多。如果您需要传递参数,请参阅[this](https://github.com/Alamofire/Alamofire/issues/1004)。 –
对不起后期重播....我尝试Alamofire但在此行之后显示空错误让“videoURL:String = NSBundle.mainBundle()。pathForResource(”IMG_2859“,ofType:”MOV“)!” – Manikandaprabu
这个'IMG_2859'在哪里?你的资产?如果是这种情况,您应该使用'UIImageJPEGRepresentation'上传它,因为您的资产将在编译时打包。检查我给你的链接。 –