質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1838閲覧

画像をサーバーにアップロードできない

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2017/07/20 10:55

編集2017/08/02 04:00

Swiftアプリで、フォトライブラリーやカメラから画像をPythonのDjangoで作ったサーバーにアップロードしたいです。
Swiftでコードを書き、実機(自分のiPHone)で実行すると、

2017-07-20 19:35:47.953836 Swift_App[250:6064] [Generic] Creating an image format with an unknown type is an error fatal error: unexpectedly found nil while unwrapping an Optional value 2017-07-20 19:35:49.270708 Kenshin_Swift[250:6064] fatal error: unexpectedly found nil while unwrapping an Optional value

とエラーが出ました。エラーが出た時、

libswiftCore.dylib`function signature specialization <preserving fragile attribute, Arg[2] = Dead, Arg[3] = Dead> of Swift._fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt, flags : Swift.UInt32) -> Swift.Never: 0x10032d184 <+0>: stp x26, x25, [sp, #-80]! 0x10032d188 <+4>: stp x24, x23, [sp, #16] 0x10032d18c <+8>: stp x22, x21, [sp, #32] 0x10032d190 <+12>: stp x20, x19, [sp, #48] 0x10032d194 <+16>: stp x29, x30, [sp, #64] 0x10032d198 <+20>: add x29, sp, #64 ; =64 0x10032d19c <+24>: mov x19, x6 0x10032d1a0 <+28>: mov x20, x5 0x10032d1a4 <+32>: mov x21, x4 0x10032d1a8 <+36>: mov x22, x3 0x10032d1ac <+40>: mov x23, x2 0x10032d1b0 <+44>: mov x24, x1 0x10032d1b4 <+48>: mov x25, x0 0x10032d1b8 <+52>: adr x8, #936936 ; protocol descriptor for Swift.CVarArg + 88 0x10032d1bc <+56>: nop 0x10032d1c0 <+60>: add x0, x8, #16 ; =16 0x10032d1c4 <+64>: movz w1, #0x28 0x10032d1c8 <+68>: orr w2, wzr, #0x7 0x10032d1cc <+72>: bl 0x10032d4b0 ; rt_swift_allocObject 0x10032d1d0 <+76>: mov x8, x0 0x10032d1d4 <+80>: stp x22, x21, [x8, #16] 0x10032d1d8 <+84>: strb w20, [x8, #32] 0x10032d1dc <+88>: str w19, [x8, #36] 0x10032d1e0 <+92>: adr x3, #241008 ; partial apply forwarder for Swift.(_fatalErrorMessage (Swift.StaticString, Swift.StaticString, Swift.StaticString, Swift.UInt, flags : Swift.UInt32) -> Swift.Never).(closure #2) 0x10032d1e4 <+96>: nop 0x10032d1e8 <+100>: mov x0, x25 0x10032d1ec <+104>: mov x1, x24 0x10032d1f0 <+108>: mov x2, x23 0x10032d1f4 <+112>: mov x4, x8 0x10032d1f8 <+116>: bl 0x100220b80 ; function signature specialization <preserving fragile attribute, Arg[1] = [Closure Propagated : reabstraction thunk helper from @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> () to @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> (@out ()), Argument Types : [@callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> ()]> of generic specialization <preserving fragile attribute, ()> of Swift.StaticString.withUTF8Buffer <A> ((Swift.UnsafeBufferPointer<Swift.UInt8>) -> A) -> A -> 0x10032d1fc <+120>: brk #0x1

とPCの画面に出ました。
実機の方はアップロードしたい画像が出て固まったままです。
アップロードを行う部分は

// // PhotoController.swift // Kenshin_Swift // // Created by 蓮池由梨 on 2017/06/11. // Copyright © 2017年 蓮池由梨. All rights reserved. // import Foundation import MobileCoreServices import UIKit class PhotoController:UIViewController,UINavigationControllerDelegate,UIImagePickerControllerDelegate{ @IBOutlet weak var myActivityIndicator: UIActivityIndicatorView! @IBOutlet weak var label: UILabel! @IBOutlet weak var myImageView: UIImageView! private var imagePicker:UIImagePickerController! var textField: UITextField! @IBAction func uploadButtonTapped(_ sender: Any) { myImageUploadRequest() } override func viewDidLoad() { super.viewDidLoad() label.adjustsFontSizeToFitWidth = true label.minimumScaleFactor = 0.5 label.text = "Tap the PhotoSelect or Camera to upload a picture" myActivityIndicator.hidesWhenStopped = true textField = UITextField() } @IBAction func PhotoSelect(_ sender: Any) { let myPickerController = UIImagePickerController() myPickerController.delegate = self; myPickerController.sourceType = UIImagePickerControllerSourceType.photoLibrary self.present(myPickerController, animated: true, completion: nil) } @IBAction func Camera(_ sender: Any) { let sourceType:UIImagePickerControllerSourceType = UIImagePickerControllerSourceType.camera // カメラが利用可能かチェック if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera){ // インスタンスの作成 let cameraPicker = UIImagePickerController() cameraPicker.sourceType = sourceType cameraPicker.delegate = self self.present(cameraPicker, animated: true, completion: nil) } else{ label.text = "error" } } // 撮影が完了時した時に呼ばれる func imagePickerController(_ imagePicker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { myImageView.contentMode = .scaleAspectFit myImageView.image = pickedImage } //閉じる処理 imagePicker.dismiss(animated: true, completion: nil) label.text = "Tap the Send to save a picture" } // 撮影がキャンセルされた時に呼ばれる func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true, completion: nil) label.text = "Canceled" } // override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } //画像のアップロード処理 func myImageUploadRequest(){ //myUrlにはphpファイルのアドレスを入れる let myUrl = NSURL(string:"http://localhost:8000/admin/accounts/post/42/change/"); let request = NSMutableURLRequest(url:myUrl! as URL) request.httpMethod = "POST" let boundary = generateBoundaryString() request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") let imageData = UIImageJPEGRepresentation(self.myImageView.image!, 1) print("here") print(self.myImageView.image) if(imageData==nil) { return; } var name = "" if let text = textField.text { name = text } let postString = "name=\(name)" // let postString = "name=\(textField.text!)" request.httpBody = postString.data(using: .utf8) //myActivityIndicator.startAnimating(); let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in if error != nil { print("error=\(error)") return } // レスポンスを出力 print("******* response = \(response)") let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) print("****** response data = \(responseString!)") DispatchQueue.main.async(execute: { //アップロード完了 }); } task.resume() } func generateBoundaryString() -> String { return "Boundary-\(NSUUID().uuidString)" } }

データがnilであるとエラーが出ていますが、
どこでなぜnilとなってしまうのでしょうか?
ブレークポイントを貼ると

let myUrl = NSURL(string:"http://localhost:8000/admin/accounts/post/42/change/");

で落ちていることがわかりました。また、その時のデータ型は
イメージ説明
であることがわかりました。
何が原因でどう直せば良いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ykws

2017/07/20 12:11

imageData が使われていないようなので、実際に画像は送信していないようですが、どこまで正常に実行できているか、ブレイクポイントなど貼って特定できますか?
ykws

2017/07/20 13:40

エラーの内容と落ちている箇所が一致しないように感じますが、エラーの内容は変わっていないですか?
退会済みユーザー

退会済みユーザー

2017/07/20 13:41

確かに、言われて気づいたのですが、
退会済みユーザー

退会済みユーザー

2017/07/20 13:42 編集

今回は2017-07-20 22:17:48.436335 Kenshin_Swift[233:4839] [Generic] Creating an image format with an unknown type is an error (lldb)  とのみエラーが出ていました
退会済みユーザー

退会済みユーザー

2017/07/20 13:42

なんででしょう。。。?コードは一切変えていないのですが。。。
ykws

2017/07/20 13:44

エラーメッセージはボタンをタップする前に表示されていませんか?
退会済みユーザー

退会済みユーザー

2017/07/21 12:35

はい、アルバムを開き画像を選択し、アプリの画面に画像を選択した時に[Generic] Creating an image〜のエラーメッセージが出ています。サーバーに画像を送るSendボタンを送る前にはエラーがもう既に出ていますね!
guest

回答2

0

ベストアンサー

var textField: UITextField!

このtextFieldがnilなんですね。

@IBOutletしてStoryboardなりXibからtextFieldとつなぐか
viewDidLoadなどの初期化のタイミングでtextField = UITextField() などしてみてください。

もしくは

swift

1var name = "" 2if let text = textField.text { 3 name = text 4} 5let postString = "name=\(name)"

投稿2017/08/02 02:18

Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/02 04:01

ありがとうございます!なるほど、そこが問題だったのですね! 質問文に記載したようにPhotoControllerを書き換えたのですが、 今度は、 error=Optional(Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSUnderlyingError=0x600000441320 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}, NSErrorFailingURLStringKey=http://localhost:8000/admin/accounts/post/42/change/, NSErrorFailingURLKey=http://localhost:8000/admin/accounts/post/42/change/, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.}) とエラーが出てしまいました。 このエラーはどの部分を見れば直せるものなのでしょうか?
Tak1016

2017/08/02 04:19

ATS(App Transport Security)というiOS9から出てきたAppleの仕様です。 アプリの全ての通信は https でないと通信させてくれません。 SSL証明書を入れてhttpsで通信できるようにしてみてください。 またはATSを無効にできます。これが一番手っ取り早いです。 http://qiita.com/tonkotsuboy_com/items/9c056b4b2b1ffb85615e しかし無効にするのは非推奨で、どのタイミングでAppleがこの無効の仕様を不可能にするかわかりません。
guest

0

!で強制アンラップしてる箇所 結構あるけどnilになっててアンラップできないって言われてる。

let imageData = UIImageJPEGRepresentation(self.myImageView.image!, 1)

この辺とかほんとに大丈夫ですかね? myImageView.imageがnilになってませんか?

投稿2017/08/01 17:35

Tak1016

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/08/02 01:52

ありがとうございます。 let imageData = UIImageJPEGRepresentation(self.myImageView.image!, 1) print("here") print(self.myImageView.image) とコードを書いて、self.myImageView.imageがあるかないかみてみたら、 Optional(<UIImage: 0x600000092b60> size {4288, 2848} orientation 0 scale 1.000000) と出力され、nilではないことがわかりました。 しかし、fatal error: unexpectedly found nil while unwrapping an Optional valueとやはりnilだと言われ、 if(imageData==nil) { return; } let postString = "name=\(textField.text!)" の let postString = "name=\(textField.text!)" で落ちてしまいました。 どのように検証したら、何が問題なのかわかりますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問