Alamofire+Multipart


Multipart?


Alamofireで画像通信したら?
->multipartはalamoreが提供する機能で、画像をデータに変換して伝送するために使用されます.
(multipart/form-dataは、ファイルをアップロードするフォーム要素のenctype属性の1つであり、multipartはform-dataが複数の部分に分けてサーバに送信されることを意味する)
この値は、サーバのAPIドキュメントを表示するときに使用されるタイミングを把握します.
Request Headerでcontent-typeがmultipart/form-dataの場合、request配列領域に対応する属性値を入力する必要があります.
また、Request Body部分に画像の他にアップロードするデータがある場合はmultipart分離データを用いてアップロードする必要がある.

プロジェクトファイルに適用


既存のAlamofireの通信方式と似ている.APIドキュメントに従ってRequest HeaderとRequest Bodyを作成すればよい.(key-value形式)
let URL = APIConstants.baseURL
URLを作成します.
let token = UserDefaultStorage.accessToken
let header : HTTPHeaders = [
	"Content-Type" : "multipart/form-data",
	"token" : token
]
API Request Headerを作成します.前述したように、画像を含む複数のデータを送信し、サーバと通信するmultipart/form-data.
let parameters: [String : Any] = [
            "sampleContent": content,
            "sampleIndex": index,
]
前述したように、Request Bodyはkey-value配列として記述される.
ここで、ポイントが実際にサーバAPIで必要とされるbodyはsampleImage(画像フォーマット)、sampleContent(Strign)、sampleIndex(int)であるが、sampleImageは他の文字列やint形式の要求主体とは異なり、multipartによってデータを個別のデータに変換するため、個別のparameters配列にデータを入れる必要はない.
その後alamfireが提供するアップロードによってデータを転送する.
アップロードプロセスは次のとおりです.
  • 基本リクエストボディを追加します.
  • for (key, value) in parameters {
        multipartFormData.append("\(value)".data(using: .utf8)!, withName: key)
    }
    request bodyのkey-value値は、forインタフェースを介してmultipartFromDataにそれぞれ追加されて転送されます.
  • 画像を追加します.
  • if let image = imageData?.pngData() {
        multipartFormData.append(image, withName: "sampleImage", fileName: "\(image).png", mimeType: "image/png")
    }
    イメージの場合、nil値を考慮してif letで転送し、どの名前とフォーマットで転送するかを記述します.

    各パラメータは次のことを意味します.
    ✔withName-キー値
    サーバーにアップロードするファイル名
    ✔mimeType-ファイル形式
    送信データのコードが書き終わったら、送信データのurl、通信方法、ヘッダが書き終わったら応答を受信すればよい.
    , to: URL, usingThreshold: UInt64.init(), method: .post, headers: header).response { response in
                guard let statusCode = response.response?.statusCode,
                      statusCode == 200
                else { return }
                completion(.success(statusCode))
    }
    その後、対応するVCに移動し、既存のalamoreサーバと通信するように上記サービスをロードし、通信を完了すればよい.
    func didTapUploadButton(_ sender: UIButton) {
    AddActionEditService.shared.editActivity(imageData: buttonImage,
    					content: activityTextView.text!,
    					year: String(date[0]),
    					month: String(date[1]),
    					day: String(date[2]),
    					index: characterIndex,activityIndex: 36) { result in
                        switch result {
                        	case .success(let msg):
                        	print("success", msg)
                        	self.dismiss(animated: true, completion: nil)
                            
                        	case .requestErr(let msg):
                        	print("requestERR", msg)
                            
                        	case .pathErr:
                        	print("pathERR")
                            
                        	case .serverErr:
                        	print("serverERR")
                            
                        	case .networkFail:
                        	print("networkFail")
                    }
    }