やりたいこと
iPhoneからPHPへ画像とテキストの送信を行いたいです。
参考記事1
参考記事2
参考にした記事がちょっと古くて今使えない記述などがあり、修正を加えてみたのですが解決しなかったので投稿させていただきました。
説明
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
あなたの回答
tips
プレビュー