2016-02-26 3 views
3

Я пытаюсь загрузить видео на свой сервер. Я выбираю видео из альбома, но «фатальная ошибка: неожиданно найден нуль при разворачивании необязательного значения».Быстрая загрузка видео на сервер 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', так как ваши активы будут упакованы при компиляции. Проверьте ссылку, которую я дал вам выше. –

ответ

4

Попробуйте это. Это работает для меня.

Сначала определите NSURL var.

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() 
} 
1

Легкий способ будет загрузить файл с помощью Alamofire.

Сначала установите Alamofire с помощью cocoapods

Включите это в стручка файл

стручок '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

есть способ проверить '.php', используя что-то вроде:' curl --upload-file file.jpg --url http: // remote_server_ip_addr/php_code_file.php'? – sAguinaga

Смежные вопросы