我正在尝试将视频上传到我的服务器。我从相册中选择了视频,但是“致命错误:在展开可选值时意外发现了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
将代码更新为swift 4.2
尝试这个。这个对我有用。
首先定义URL var。
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()
}
简单的方法是使用Alamofire上传文件。
首先使用cocoapods安装Alamofire
将其包含在您的pod文件中
在'Alamofire'下,'〜> 4.0'
然后转到终端并将目录更改为您的项目并输入
pod安装
现在
进口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";
}
?>
使用Alamofire 5,您可以将视频上传到服务器:
import Alamofire
func uploadVideo(videoUrl: URL) { // local video file path..
let timestamp = NSDate().timeIntervalSince1970 // just for some random name.
AF.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(videoUrl, withName: "image", fileName: "\(timestamp).mp4", mimeType: "\(timestamp)/mp4")
}, to: endPoint! ).responseJSON { (response) in
debugPrint(response)
}
}
注意:endPoint是一个字符串。示例:http://172.10.3.7:5000/uploadvideo