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

+0

尝试使用Alamofire,这是一个容易得多。如果您需要传递参数,请参阅[this](https://github.com/Alamofire/Alamofire/issues/1004)。 –

+0

对不起后期重播....我尝试Alamofire但在此行之后显示空错误让“videoURL:String = NSBundle.mainBundle()。pathForResource(”IMG_2859“,ofType:”MOV“)!” – Manikandaprabu

+0

这个'IMG_2859'在哪里?你的资产?如果是这种情况,您应该使用'UIImageJPEGRepresentation'上传它,因为您的资产将在编译时打包。检查我给你的链接。 –

尝试此。 它适合我。

首先定义一个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"; 
} 


?> 
+0

的“urlvideo”是否有一种方法可以使用类似下面的方法来测试'.php':curl --upload-file file.jpg --url http:// remote_server_ip_addr/php_code_file.php'? – sAguinaga