【问题标题】:Swift Upload Video to Http server?Swift 将视频上传到 Http 服务器?
【发布时间】:2016-06-09 07:43:07
【问题描述】:

我正在尝试将视频上传到我的服务器。 我从相册中选择视频,但“致命错误:在展开可选值时意外发现 nil”。

请查看以下代码以获取更多信息。

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

【问题讨论】:

  • 尝试使用Alamofire,它更容易。如需传参,请参考this
  • 抱歉延迟重播...... !”
  • 这是哪里的IMG_2859?你的资产?如果是这种情况,您应该使用UIImageJPEGRepresentation 上传它,因为您的资产将在编译时打包。检查我上面给你的链接。
  • 相册中的IMG_2859视频->相机胶卷
  • 您不能以这种方式访问​​不在您项目中的资源。你知道用户的照片库恰好有你需要的图像是没有意义的。

标签: ios swift ios9 nsurlsession


【解决方案1】:

将代码更新到 swift 4.2

试试这个。 它对我有用。

首先定义一个 URL 变量。

var videoPath: URL?

然后使用 UIImagePickerControllerDelegate 获取文件的信息。

extension ViewController: UIImagePickerControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as? URL {
            print(videoURL)
        }
        self.dismiss(animated: true, completion: nil)
    }
}

这是上传事件方法:

// upload event
func uploadMedia(){
    if videoPath == nil {
        return
    }

    guard let url = URL(string: "server_path") else {
        return
    }
    var request = URLRequest(url: url)
    let boundary = "------------------------your_boundary"

    request.httpMethod = "POST"
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    var movieData: Data?
    do {
        movieData = try Data(contentsOf: url, options: Data.ReadingOptions.alwaysMapped)
    } catch _ {
        movieData = nil
        return
    }

    var body = Data()

    // change file name whatever you want
    let filename = "upload.mov"
    let mimetype = "video/mov"

    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"file\"; filename=\"\(filename)\"\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append(movieData!)
    request.httpBody = body

    let task = URLSession.shared.dataTask(with: request) { (data: Data?, reponse: URLResponse?, error: Error?) in
        if let `error` = error {
            print(error)
            return
        }
        if let `data` = data {
            print(String(data: data, encoding: String.Encoding.utf8))
        }
    }

    task.resume()
}

【讨论】:

【解决方案2】:

简单的方法是使用 Alamofire 上传文件。

首先使用 cocoapods 安装 Alamofire

将其包含在您的 pod 文件中

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";
 }


 ?>

【讨论】:

  • 有没有办法测试.php 使用类似的东西:curl --upload-file file.jpg --url http://remote_server_ip_addr/php_code_file.php