LoginSignup
32
28

More than 5 years have passed since last update.

swiftでサーバーにテキストと画像ファイルをPOSTする

Posted at

前回 "swiftでサーバーにテキストをPOSTする" でテキスト投稿についてメモしました。今回は画像ファイルの投稿についてメモします。
画像投稿は難しいということなので net というライブラリを使うことにしました。
そのためテキストを送信するコードも大きく変わっています。
Netについては "最高なHttpRequest in Swift" をみてください。

ライブラリ

Netのライブラリ:GitHub をForkしてDesktopにダウンロードしたNetをxcodeのファイルにコピーしました。

コード

ViewController.swift

import UIKit

class ViewController: UIViewController, UITextFieldDelegate, NSURLSessionTaskDelegate{
    var json:NSData!

    let net = Net(baseUrlString: "送信先のURL")

    override func viewDidLoad() {
        super.viewDidLoad()

        //背景色をorangeにする
        self.view.backgroundColor = UIColor.orangeColor()

        // UITextFieldを作成する.
        let myTextField: UITextField = UITextField(frame: CGRectMake(0,0,200,30))

        // はじめに表示する文字を代入する.
        myTextField.text = ""

        // Delegateを設定する.
        myTextField.delegate = self

        // 枠を表示する.
        myTextField.borderStyle = UITextBorderStyle.RoundedRect

        // UITextFieldの表示する位置を設定する.
        myTextField.layer.position = CGPoint(x:self.view.bounds.width/2,y:100);

        // Viewに追加する.
        self.view.addSubview(myTextField)


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    /*
    UITextFieldが編集終了する直前に呼ばれる.
    */
    func textFieldShouldEndEditing(textField: UITextField) -> Bool {

        //送信する文字をtextFieldから取得する
        let str = "\(textField.text)"

        //textFieldを空白になおす
        textField.text = ""

        //送信する画像を設定する
        let img = UIImage(named: "logo.png")!

        //送信先のpostを設定する
        let url = "/post"

        //送信するパラメータを設定する.rubyであればparams[:text]がstrになる
        let params = ["text": str, "file": NetData(pngImage: img, filename: "logo")]

        //送信する
        net.POST(url, params: params, successHandler: {
            responseData in
            //let result = responseData.json(error: nil)
            NSLog("Success")
            }, failureHandler: { error in
                NSLog("Error")
        })

        return true
    }

    /*
    改行ボタンが押された際に呼ばれる.
    */
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()

        return true
    }

}

注意:送信先が http://example.com/post なら

let net = Net(baseUrlString: "http://example.com")

let url = "/post"

とします。

問題と次の目標

送信後に "Error" がでますが問題なく送信できています。おそらくサーバーサイドからのresponseDataがないからでしょう。次はカメラで撮った画像を送信できるようにします。

参考

Netのライブラリ:GitHub
https://github.com/nghialv/Net

Netで画像投稿などの補足情報
http://da1hara.hatenablog.com/entry/2014/11/12/042718

テキストフィールドの生成
https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/uikit/004-uitextviewde-wen-ziwo-ru-li

私が作った数学サイト(アプリで投稿したいサイト)
https://question-board.herokuapp.com

32
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
28