質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2322閲覧

NSURLSessionでの複数回アップロードの一部が失敗する

ia_isier

総合スコア29

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2015/09/05 13:54

編集2015/09/05 14:03

閲覧いただきありがとうございます。

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}

また、今回複数の非同期処理の待ち受けを強引に実装してしまいましたが、
もっと効率の良い実装の仕方があればそちらもご指摘いただけますと嬉しいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

こちら自己解決致しました。
php.iniでupload_max_filesizeを小さく指定しているのが原因でした。
まず先に確認すべき箇所でした…失礼しました。

投稿2015/09/05 17:42

ia_isier

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問