0

マルチパート フォーム データを使用して動画のアップロードを受け入れる API を使用しています。アップロードを処理するために NSURLSession.uploadTask (およびそのデリゲート) を使用したいと思います。

私の問題は、使用している API で動作するようにローカル ビデオ ファイルを変更する必要があることです。私がやりたいことの例を作成しました。

let localVideoURL = URL(string: "file://AGoodURL/video.mov")!
let apiURL = URL(string: "https://myServer.com/upload")

func uploadVideo() {

let config = URLSessionConfiguration.background(withIdentifier: "myUploads")
let session = URLSession(configuration: config, delegate: nil, delegateQueue: nil)

var request = NSMutableURLRequest(url: apiURL!)
request.httpMethod = "POST"

// create a new file from the local file + required api data

var boundary : String {

    return "Boundary-\(UUID().uuidString)"
}

// what should be a new file and not an in memory data object, but how?
var data = Data()

// do I need to set these or will the uploadTaskWithFile class handle it?
data.append("--\(boundary)\r\n".data(using: .utf8)!)

data.append("Content-Disposition: form-data; name=\"video\"; filename=\"video.mov\"\r\n".data(using: .utf8)!)

// same question? does this need to be here?
data.append("Content-Type: video/quicktime\r\n\r\n".data(using: .utf8)!)

/** somehow get the data from the local url without loading it into memory */
// data.append(try! Data(contentsOf: localVideoURL)) /** not like this! */

data.append("\r\n".data(using: .utf8)!)
data.append("--\(boundary)--\r\n".data(using: .utf8)!)

// close the new file
// begin an uploadTask with the new file, use URLSessionDelegates.

session.uploadTask(with: request, fromFile: )

}

新しいローカル ファイルを作成し、上記のように文字列データを追加し、ローカル ビデオ ファイルを追加し、残りの文字列データを追加するにはどうすればよいですか? これらのファイルは非常に大きくなる可能性があるため、すべてをディスク上に保持することが重要です。

4

1 に答える 1

0

解決策は、新しいローカル一時ファイルで入力ストリームと出力ストリームを使用することでした。出力ストリームの作成後、マルチパートフォームのアップロードに必要なヘッダーデータを追加し、既存のローカルファイルをチャンクで追加してから、データを閉じて(境界など)、ストリームを閉じます。

次に、そのファイルを使用します。このファイルは、リクエストの httpBody プロパティをファイル付きの NSURLSession uploadTask でカプセル化します。

于 2016-10-19T20:17:16.070 に答える