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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

0回答

797閲覧

iPhoneからPHPへ画像とテキストを送信する

ryohasegawa

総合スコア437

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2021/06/01 08:35

編集2021/06/01 12:25

やりたいこと

iPhoneからPHPへ画像とテキストの送信を行いたいです。

参考記事1
参考記事2
参考にした記事がちょっと古くて今使えない記述などがあり、修正を加えてみたのですが解決しなかったので投稿させていただきました。

説明

PHP側のコードは完成しているため省きます。
イメージ説明

dummyでdummyという文字、idでiPhone本体のUUID、files[]で画像(複数可能)を送信を想定しています。

コード

let manager: PHImageManager = PHImageManager() //メディアタイプをビデオに絞って取得(写真) let assets:PHFetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: nil) //取得したアセットを変換 assets.enumerateObjects({(obj, index, stop) -> Void in manager.requestImage(for: obj, targetSize: CGSize(width: obj.pixelWidth, height: obj.pixelHeight), contentMode: .aspectFill, options: nil) {(image, info) -> Void in if(!arr.contains(String(obj.hashValue))){ // pngで保存する場合 // let pngImageData = image!.pngData() // self.backImageView.image = image! as UIImage // jpgで保存する場合 // let jpgImageData = UIImageJPEGRepresentation(image, 1.0) // let documentsURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask)[0] // let fileURL = documentsURL.appendingPathComponent("(String(obj.hashValue)).png") // do { // try pngImageData!.write(to: fileURL) // } catch { // //エラー処理 // print("エラー") // } // print(fileURL) // print(pngImageData!) // print("サーバーと通信をする") // 送信処理 var request = URLRequest(url: URL(string: "http://192.168.100.16:8200")!) request.httpMethod = "POST" request.addValue("application/json", forHTTPHeaderField: "content-type") do{ // クエリをサーバーに投げる request.httpBody = try JSONEncoder().encode(["query":"mutation{data(uuid:\"(UUID().uuidString)\",hash:\"(obj.hashValue)\",data:\"0000000\")}"]) }catch{ print("エラー") } let t = URLSession.shared.uploadTask(with: request, from: nil) { data, response, err in if err != nil{ print("エラー") } let resultData = String(data: data!,encoding: .utf8)! // print(resultData) // 送信済みリストを取得 print("通信結果", resultData) // func2(resultData: resultData) } t.resume() sleep(5) } } }) }

最初は一度pngファイルに保存してから送信しようとしてたのですが、ファイルに保存しなくてもpng形式に変換すれば送れそうだったので、pngImageDataに入ったpngデータを送信しようとしてます。その関係でコメントアウトが多くなってます。

アドバイスを頂き、画像データをPNG形式へ変換し、そのデータをBase64でエンコードしたデータをPHPへ送信し、PHP側でPNGファイルへデコードする事にしました。
なんですが、別問題が発生しました。
読み込んだ画像をpngへ変換する処理(let pngImageData = image!.pngData())を加えると、メモリのエラーで落ちます。←おそらくメモリ不足
で、スリープを挟もうとおもいスリープを挟むとHTTP通信でエラーになります。
これをうまく回避する方法はありませんか?

エラー

メモリのエラー
イメージ説明

スリープを挟むと通信できない...

log

12021-06-01 21:23:05.839333+0900 U22[6841:1264487] [connection] nw_endpoint_handler_set_adaptive_read_handler [C2 192.168.100.16:8200 ready channel-flow (satisfied (Path is satisfied), viable, interface: en0, ipv4, ipv6, dns)] unregister notification for read_timeout failed 22021-06-01 21:23:05.839464+0900 U22[6841:1264487] [connection] nw_endpoint_handler_set_adaptive_write_handler [C2 192.168.100.16:8200 ready channel-flow (satisfied (Path is satisfied), viable, interface: en0, ipv4, ipv6, dns)] unregister notification for write_timeout failed 32021-06-01 21:23:10.479982+0900 U22[6841:1264484] [connection] nw_endpoint_handler_set_adaptive_read_handler [C3 192.168.100.16:8200 ready channel-flow (satisfied (Path is satisfied), viable, interface: en0, ipv4, ipv6, dns)] unregister notification for read_timeout failed 42021-06-01 21:23:10.480112+0900 U22[6841:1264484] [connection] nw_endpoint_handler_set_adaptive_write_handler [C3 192.168.100.16:8200 ready channel-flow (satisfied (Path is satisfied), viable, interface: en0, ipv4, ipv6, dns)] unregister notification for write_timeout failed 52021-06-01 21:23:10.848275+0900 U22[6841:1264486] [connection] nw_endpoint_handler_set_adaptive_read_handler [C4 192.168.100.16:8200 ready channel-flow (satisfied (Path is satisfied), viable, interface: en0, ipv4, ipv6, dns)] unregister notification for read_timeout failed 62021-06-01 21:23:10.848521+0900 U22[6841:1264486] [connection] nw_endpoint_handler_set_adaptive_write_handler [C4 192.168.100.16:8200 ready channel-flow (satisfied (Path is satisfied), viable, interface: en0, ipv4, ipv6, dns)] unregister notification for write_timeout failed 72021-06-01 21:23:12.232012+0900 U22[6841:1264486] XPC connection interrupted

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

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

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

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

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

hoshi-takanori

2021/06/01 09:00 編集

content-type: application/json なのに httpBody が JSON になってないのでは。 また、pngImageData は適切にエンコードして送信する必要があるのでは。 というか、php 側ではどういう形式で受け取ることになってるのでしょうか?
ryohasegawa

2021/06/01 10:07

content-typeの指定ありがとうございます。 コードを修正させていただきました。 PHP側は画像ファイルで受け取るようになってます。 現状のソースだと、画像データをファイル保存する前に送りつけているのでうまく受け取れないのだと思います。
hoshi-takanori

2021/06/01 10:08

画像ファイルの受け取り方にもいろいろあるから聞いてるんですけど…。
ryohasegawa

2021/06/01 10:12

$_FILES["files"]["tmp_name"][$i]で受け取ってます。 複数枚受け取れるようにしてあるので、$iでループ回してます。
ryohasegawa

2021/06/01 10:32

バイナリデータで送信してPHP側でバイナリデータを画像ファイルに加工したほうが良いということでしょうか?
hoshi-takanori

2021/06/01 10:40

バイナリデータだと文字と画像を同時に送るのが面倒なので、iOS 側は base64 などにエンコードして json で送る方が簡単ですね。php 側が多少面倒になるかも知れませんが…。
tomato879241

2021/06/01 10:46

>iPhoneからPHPへ画像とテキストの送信を行いたいです。 どういう意味でしょうか?PHPファイルを通してMySQLのテーブルにデータを保存するという意味でしょうか?
ryohasegawa

2021/06/01 11:01

iPhone内にある画像をPHPのサーバーに送信したいという事です。 最終的にサーバーで保存される形式はPNGやJPEGが良いです。
tomato879241

2021/06/01 11:08

「PHPのサーバー」って何ですか?PHPファイルを通してLinexあるいはWindow serverのある場所にファイルを保存するという意味ですか?
ryohasegawa

2021/06/01 11:54

そうです。 hoshi-takanoriさんからのアドバイスでiPhone側でBase64エンコードして、それを文字データとしてPHPへ送信し、PHP側でデコードしてファイルに保存してはとアドバイスをもらいました。
tomato879241

2021/06/01 12:03

それじゃあ、hoshi-takanoriさんの指示通り、URLSessionでデータをサーバーに送ってください。
ryohasegawa

2021/06/01 12:11

はい。そうさせていただきます。 考えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問