LoginSignup
22
26

More than 5 years have passed since last update.

Swiftでファイルをサーバーに保存しよう!

Last updated at Posted at 2016-06-07

【お知らせ】Swift3に対応しました!(2017/02/24更新)

【Swift×mBaaS】シリーズ概要

  • Swiftでニフクラ mobile backend (通称:mBaaS)を使ってSwiftで開発を始めたい人向けのドキュメントです
  • ニフクラ mobile backend のiOS(Objectiv-C SDK)用ドキュメントSwift用に書き換えて動かしてみたものをまとめました
  • 初心者でもわかりやすいよう心掛けて作っていますが、わかりにくい部分がありましたらコメントをいただければ訂正しますのでお気軽にご意見をお願いします^^*
  • 今回は<ファイルストア編>です!

事前準備のお願い

Swiftでファイルをサーバーに保存しよう!

ダッシュボードでの事前設定

  • ニフクラ mobile backend のダッシュボードを開きます
  • 「アプリ設定」>「データ・ファイルストア」>「データストア」の「アプリからのクラス作成」を「有効」にして、「保存する」をクリックします

スクリーンショット 2016-06-07 13.07.32.png

ドキュメント

ファイルストアへのアップロード

画像データを扱う場合

  • 画像(.png)を1つ用意して、 AppDelegate.swiftと同じディレクトリにドラッグ&ドロップして取り込みます
    • この画像をファイルストアへアップロードしてみます★
  • 下図のように画像ファイルを「test.png」とした場合にアップロードするドキュメントは以下のように書けます

スクリーンショット 2016-06-07 13.01.50.png

Swift3_AppDelegate.swift
// ファイル名を指定して画像を生成
let fileName = "test.png"
let imageFile = UIImage(named: fileName)
if imageFile == nil {
    // ファイル名が無効だった場合
}

//////////////////////////////////////////////////////////////////////////
// 画像をリサイズする(任意)
/* Basic会員は5MB、Expert会員は100GBまでのデータを保存可能です */
/* 上限を超えてしまうデータの場合はリサイズが必要です */
let imageW : Int = Int(imageFile!.size.width*0.2) /* 20%に縮小 */
let imageH : Int = Int(imageFile!.size.height*0.2) /* 20%に縮小 */
let resizeImage = resize(image: imageFile!, width: imageW, height: imageH)
//////////////////////////////////////////////////////////////////////////

// 画像をNSDataに変換
let pngData = NSData(data: UIImagePNGRepresentation(resizeImage)!)
let file = NCMBFile.file(withName: fileName, data: pngData as Data!) as! NCMBFile

// ファイルストアへ画像のアップロード
file.saveInBackground({ (error) in
    if error != nil {
        // 保存失敗時の処理
    } else {
        // 保存成功時の処理
    }
}) { (int) in
    // 進行状況を取得するためのBlock
    /* 1-100のpercentDoneを返す */
    /* このコールバックは保存中何度も呼ばれる */
    /*例)*/
    print("\(int)%")
}
Swift2_AppDelegate.swift
// ファイル名を指定して画像を生成
let fileName = "test.png"
let imageFile = UIImage(named: fileName)
if imageFile == nil {
    // ファイル名が無効だった場合
}

//////////////////////////////////////////////////////////////////////////
// 画像をリサイズする(任意)
/* Basic会員は5MB、Expert会員は100GBまでのデータを保存可能です */
/* 上限を超えてしまうデータの場合はリサイズが必要です */
let imageW : Int = Int(imageFile!.size.width*0.2) /* 20%に縮小 */
let imageH : Int = Int(imageFile!.size.height*0.2) /* 20%に縮小 */
let resizeImage = resize(imageFile!, width: imageW, height: imageH)
//////////////////////////////////////////////////////////////////////////

// 画像をNSDataに変換
let pngData = NSData(data: UIImagePNGRepresentation(resizeImage)!)
let file = NCMBFile.fileWithName(fileName, data: pngData) as! NCMBFile

// ファイルストアへ画像のアップロード
file.saveInBackgroundWithBlock({ (error: NSError!) -> Void in
    if error != nil {
        // 保存失敗時の処理
    } else {
        // 保存成功時の処理   
    }
}, progressBlock: { (int: Int32) -> Void in
    // 進行状況を取得するためのBlock
    /* 1-100のpercentDoneを返す */
    /* このコールバックは保存中何度も呼ばれる */
})
  • 次に、今追記していたdidFinishLaunchingWithOptionsメソッドの下(外側)に、下記のコードを 記述します
Swift3_AppDelegate.swift
// 画像をリサイズする処理
func resize (image: UIImage, width: Int, height: Int) -> UIImage {
    let size: CGSize = CGSize(width: width, height: height)
    UIGraphicsBeginImageContext(size)
    image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
    let resizeImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return resizeImage!
}
Swift2_AppDelegate.swift
// 画像をリサイズする処理
func resize (image: UIImage, width: Int, height: Int) -> UIImage {
    let size: CGSize = CGSize(width: width, height: height)
    UIGraphicsBeginImageContext(size)
    let resizeImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return resizeImage
}

画像以外のデータの場合

  • 「Test Message」と書かれた 「test.txt」ファイルをアップロードする場合
Swift3_AppDelegate.swift
// データを作成
let data = "Test Message".data(using: String.Encoding.utf8)
// ファイル名とデータを指定してNCMBオブジェクトを生成
let file = NCMBFile.file(withName: "test.txt", data: data) as! NCMBFile
// ファイルストアにアップロード
file.save(nil)
Swift2_AppDelegate.swift
// データを作成
let data = "Test Message".dataUsingEncoding(NSUTF8StringEncoding)
// ファイル名とデータを指定してNCMBオブジェクトを生成
let file = NCMBFile.fileWithName("test.txt", data: data)
// ファイルストアにアップロード
file.save(nil)

ファイルの取得

  • Main.storyboardに取得したファイル(.png)を表示するimageViewを作成しておきます
  • 作成したimageViewは、myImgaeViewとしてViewController.swiftに紐付けておきます

スクリーンショット 2016-06-07 14.55.58.png

  • ViewController.swiftviewDidLoadメソッドにファイル取得処理を書きます
  • 次のコードは取得した画像ファイルをmyImageViewに表示するドキュメントです
Swift3_ViewController.swift
import UIKit
import NCMB

class ViewController: UIViewController {
    // ImageView作成
    @IBOutlet weak var myImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // 画面表示時に実行される
        let fileData = NCMBFile.file(withName: "test.png", data: nil) as! NCMBFile
        fileData.getDataInBackground { (data, error) in
            if error != nil {
                // ファイル取得失敗時の処理
            } else {
                // ファイル取得成功時の処理
                let image = UIImage.init(data: data!)
                self.myImageView.image = image
                self.view.addSubview(self.myImageView)
            }
        }  
    }
}
Swift2_ViewController.swift
import UIKit
import NCMB

class ViewController: UIViewController {
    // ImageView作成
    @IBOutlet weak var myImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // 画面表示時に実行される
        let fileData = NCMBFile.fileWithName("test.png", data: nil)
        fileData.getDataInBackgroundWithBlock { (data: NSData!, error: NSError!) -> Void in
            if error != nil {
                // ファイル取得失敗時の処理
            } else {
                // ファイル取得成功時の処理
                let image = UIImage.init(data: data)
                self.myImageView.image = image
                self.view.addSubview(self.myImageView)

            }
        }  
    }
}
  • ファイルの検索を利用することもできます
  • クエリを取得して、ファイルストアを検索して取得した場合のドキュメントです
Swift3_ViewController.swift
// ファイルストアを検索するクエリを作成
let query = NCMBFile.query()
// 検索するファイル名を設定
query?.whereKey("fileName", equalTo: "test.png")
// ファイルストアの検索を実行
query?.findObjectsInBackground({ (files, error) in
    if error != nil {
        // 検索失敗時の処理
    } else {
        // 検索成功時の処理
        for file in files! as! [NCMBFile] {
            file.getDataInBackground({ (data, error) in
                if error != nil {
                    // ファイル取得失敗時の処理  
                } else {
                    // ファイル取得成功時の処理
                    let image = UIImage.init(data: data!)
                    self.myImageView.image = image
                    self.view.addSubview(self.myImageView)
                }
            })
        }
    }
})
Swift2_ViewController.swift
// ファイルストアを検索するクエリを作成
let query = NCMBFile.query()
// 検索するファイル名を設定
query.whereKey("fileName", equalTo: "test.png")
// ファイルストアの検索を実行
query.findObjectsInBackgroundWithBlock { (files: [AnyObject]!, error: NSError!) -> Void in
    if error != nil {
        // 検索失敗時の処理
    } else {
        // 検索成功時の処理
        for file in files {
            file.getDataInBackgroundWithBlock({ (data: NSData!, error: NSError!) -> Void in
                if error != nil {
                    // ファイル取得失敗時の処理
                } else {
                    // ファイル取得成功時の処理
                    let image = UIImage.init(data: data)
                    self.myImageView.image = image
                    self.view.addSubview(self.myImageView)        
                }
            })
        }
    }
}

ファイルの削除

  • deleteメソッドを利用して、ファイルを削除することができます
Swift3
file.deleteInBackground(nil)
Swift2
file.deleteInBackgroundWithBlock(nil)

参考

22
26
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
22
26