閲覧いただきありがとうございます。
Swiftにて、『ユーザーがカメラロールから選択した動画(10秒程度)を複数個同時にアップロードする』という処理を実装しているのですが、
上記の通り一部の動画がアップロードできずに苦戦しています。
処理の流れとしては、
1:ユーザーが動画をアプリ内のcacheディレクトリにアップ
2:クライアント(cacheディレクトリ)からwebサーバ(apache,PHP)にアップロード
3:PHPからawsS3サーバにアップロード
4:アップロードが完了した(dataTaskWithRequestのコールバックが返ってきた)リクエストはコールバック内でアップロード完了フラグを立てる
5:全アップロードの完了フラグが立った場合、アラートを出す
といったフローとなっています。
PHPのログを見たところ、
httpリクエスト自体は送られているものの、httpボディ部に何も添付されていないようでした。
ボディ部に動画データが添付されているリクエストに関しては正常にS3にアップロードできているため、原因はクライアント側にあるのではないかと思っています。
急ぎのため、本件に関して何か少しでもご存知の方がいらっしゃいましたらアドバイスいただけましたら幸いです。
クライアントからアップロードするコードは以下の通りになります。
swift
1var completeUploadArray: [Int] 2let url = NSURL(string: Constants.Env.getApiUrl() + "/upload/movie") 3let request: NSMutableURLRequest = NSMutableURLRequest() 4request.URL = url 5request.HTTPMethod = "POST" 6request.timeoutInterval = 20.0 7let uniqueId = NSProcessInfo.processInfo().globallyUniqueString 8 9// movieURLArrayにはユーザーが選択した動画のファイル名が配列で入っています 10for (index, movieUrl) in enumerate(movieURLArray) { 11 12 let path: String = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true)[0] as! String 13 let data: NSData = NSData(contentsOfFile: path + "/" + movieUrl)! 14 var body: NSMutableData = NSMutableData() 15 var postData: String = String() 16 var boundary: String = "---------------------------\(uniqueId)" 17 18 request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 19 postData += "--\(boundary)\r\n" 20 postData += "Content-Disposition: form-data; name=\"movie\"; filename=\"\(index)\"\r\n" 21 postData += "Content-Type: video/mov\r\n\r\n" 22 body.appendData(postData.dataUsingEncoding(NSUTF8StringEncoding)!) 23 body.appendData(data) 24 postData = String() 25 postData += "\r\n" 26 postData += "\r\n--\(boundary)--\r\n" 27 body.appendData(postData.dataUsingEncoding(NSUTF8StringEncoding)!) 28 29 request.HTTPBody = NSData(data:body) 30 31 let config = NSURLSessionConfiguration.defaultSessionConfiguration() 32 let session = NSURLSession(configuration: config) 33 34 let task: NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: { data, response, error in 35 36 var json = JSON.nullJSON 37 if error == nil && data != nil { 38 39 // アップロードが完了した動画のインデックスを格納 40 self.completeUploadArray.append(index) 41 // 全動画のアップロードが成功した場合の処理 42 if self.completeUploadArray.count == movieURLArray.count { 43 // 動画アップロードが成功した旨を表示 44 } 45 46 } else { 47 // エラー表示 48 } 49 50 }) 51 52 task.resume() 53 54}
また、今回複数の非同期処理の待ち受けを強引に実装してしまいましたが、
もっと効率の良い実装の仕方があればそちらもご指摘いただけますと嬉しいです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。