Article

Uploading Data to a Website データをウェブサイトにアップロードする

Post data from your app to servers. データをあなたのアプリからサービスにポストします。

Overview 概要

Many apps work with servers that accept uploads of files like images or documents, or use web service API endpoints that accept structured data like JSON. To upload data from your app, you use a URLSession instance to create a URLSessionUploadTask instance. The upload task uses a URLRequest instance that details how the upload is to be performed. 多くのアプリは、画像や書類のようなファイルのアップロードを受け入れるサーバーと仕事します、またはJSONのような構造化データを受け入れるウェブサービスAPIエンドポイントを使います。あなたのアプリからデータをアップロードするには、あなたはURLSessionインスタンスを使って、URLSessionUploadTaskインスタンスを作成します。アップロードタスクは、URLRequestインスタンスを使います、それはどのようにアップロードが実行されるかについて詳述します。

Prepare Your Data for Upload あなたのデータをアップロードのために準備する

The data to upload can be the contents of a file, a stream, or data, as is the case in Listing 1. アップロードするデータは、ファイル、ストリーム、またはデータの内容であることができます、コード出力 1 での場合のように。

Many web service endpoints take JSON-formatted data, which you create by using the JSONEncoder class on Encodable types like arrays and dictionaries. As shown in Listing 1, you can declare a structure that conforms to Codable, create an instance of this type, and use JSONEncoder to encode the instance to JSON data for upload. コード出力 1 で示されるように、あなたはCodableに準拠するある構造体を宣言して、この型のインスタンスを作成します、そしてJSONEncoderを使ってそのインスタンスをアップロード用のJSONデータにエンコードします。

Listing 1 Preparing JSON data for upload コード出力 1 JSONデータをアップロード用に準備する

struct Order: Codable {
    let customerId: String
    let items: [String]
}


// ...


let order = Order(customerId: "12345",
                  items: ["Cheese pizza", "Diet soda"])
guard let uploadData = try? JSONEncoder().encode(order) else {
    return
}

There are many other ways to create a data instance, such as encoding an image as JPEG or PNG data, or converting a string to data by using an encoding like UTF-8. データインスタンスを作成する多くの他の方法があります、たとえば画像をJPEGまたはPNGデータとしてエンコードする、または文字列をデータへとUTF-8のようなエンコーディングを使うことで変換するなど。

Configure an Upload Request アップロードリクエストを構成設定する

An upload task requires a URLRequest instance. As shown in Listing 2, set the httpMethod property of the request to "POST" or "PUT", depending on what the server supports and expects. Use the setValue(_:forHTTPHeaderField:) method to set the values of any HTTP headers that you want to provide, except the Content-Length header. The session figures out content length automatically from the size of your data. アップロードタスクは、URLRequestインスタンスを必要とします。コード出力 2 で示されるように、リクエストのhttpMethodプロパティ"POST"または"PUT"に設定してください、そのサーバーがサポートおよび期待するのは何かに依存して。setValue(_:forHTTPHeaderField:)メソッドを使って、あなたが提供することを望むあらゆるHTTPヘッダの値を設定してください、ただしContent-Lengthヘッダは除いて。セッションは、内容の長さをあなたのデータのサイズから自動的に計算します。

Listing 2 Configuring a URL request コード出力 2 URLリクエストを構成設定する

let url = URL(string: "https://example.com/post")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")

Create and Start an Upload Task アップロードタスクを作成して開始する

To begin an upload, call uploadTask(with:from:completionHandler:) on a URLSession instance to create an uploading URLSessionTask instance, passing in the request and the data instances you’ve previously set up. Because tasks start in a suspended state, you begin the network loading process by calling resume() on the task. Listing 3 uses the shared URLSession instance, and receives its results in a completion handler. The handler checks for transport and server errors before using any returned data. アップロードを始めるには、uploadTask(with:from:completionHandler:)URLSessionインスタンス上で呼び出して、アップロードを行うURLSessionTaskインスタンスを、あなたが以前に準備しておいたリクエストとデータインスタンスを渡して、作成してください。タスクは待機状態で開始することから、あなたはネットワークロード処理を、resume()をそのタスク上で呼び出すことによって開始します。コード出力 3 は、共有URLSessionインスタンスを使います、そしてそれの結果を完了ハンドラにおいて受け取ります。ハンドラは、転送およびサーバーエラーについて、何らかの返されたデータを使う前に、確認します。

Listing 3 Starting an upload task コード出力 3 アップロードタスクを作成する

let task = URLSession.shared.uploadTask(with: request, from: uploadData) { data, response, error in
    if let error = error {
        print ("error: \(error)")
        return
    }
    guard let response = response as? HTTPURLResponse,
        (200...299).contains(response.statusCode) else {
        print ("server error")
        return
    }
    if let mimeType = response.mimeType,
        mimeType == "application/json",
        let data = data,
        let dataString = String(data: data, encoding: .utf8) {
        print ("got data: \(dataString)")
    }
}
task.resume()

Alternatively, Upload by Setting a Delegate あるいは、委任先を設定することによってアップロードする

As an alternative to the completion handler approach, you can instead set a delegate on a session you configure, and then create the upload task with uploadTask(with:from:). In this scenario, you implement methods from the URLSessionDelegate and URLSessionTaskDelegate protocols. These methods receive the server response and any data or transport errors. 完了ハンドラ手法の代替として、あなたは代わりにある委任先をあなたが構成設定するセッション上で設定できます、そしてそれからアップロードタスクをuploadTask(with:from:)で作成します。このシナリオでは、あなたはメソッドをURLSessionDelegateおよびURLSessionTaskDelegateプロトコルから実装します。これらメソッドは、サーバー応答と何らかのデータまたは転送エラーを受け取ります。

See Also 参照

Uploading アップロード