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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

PHP

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

Q&A

解決済

3回答

2563閲覧

画像と文字列を同時に送りたい(PHP->Android)

takg

総合スコア125

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

PHP

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

0グッド

0クリップ

投稿2017/03/03 11:46

###前提・実現したいこと
サーバ側PHPでDBからSELECTした画像及び文字列を、Android端末に渡したいと考えています。
画像単体の受け渡しには成功したのですが、同時に文字列も同時に受け渡すとなると方法が良く分からず困っております。
下記処理に、どのような加筆をすれば良いでしょうか?
宜しくお願いします。

PHP

1 $sql = "SELECT image FROM xxx WHERE name = ?"; 2 if ($stmt = $mysqli->prepare($sql)) { 3 global $searchWord; 4 // 条件値をSQLにバインドする 5 $stmt->bind_param("s", $searchWord); 6 7 // 実行 8 $stmt->execute(); 9 10 // 取得結果を変数にバインドする 11 $stmt->bind_result($image); 12 while ($stmt->fetch()) { 13 header('Content-type: image/jpeg'); 14 echo $image; 15 } 16 $stmt->close(); 17 }

android

1@非同期処理クラス 2 //略 3 4 URL url = new URL(mURL); 5 HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 6 7 // 接続 8 connection.connect(); 9 10 //略 11 12 //画像デコード 13 InputStream inputStream = connection.getInputStream(); 14 Bitmap bitmap_result = BitmapFactory.decodeStream(inputStream);

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

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

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

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

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

guest

回答3

0

MessagePackを使用すればバイナリのまま送信できます。
サイト見ればわかりますが、様々な言語で実装されています。

###サンプル
PHP側のMessagePackライブラリは、Msgpack for PHPが有名ですが、私のマシンだとインストールできない(pecl自体がそもそも不具合を起こしてる)ため、composerでインストールできるrybakit/msgpackを使用しています。
PHP側
PHPのMessagePackライブラリインストールはcomposerで行います。

$ composer require rybakit/msgpack

php

1<?php 2require_once "vendor/autoload.php"; 3 4use MessagePack\Packer; 5 6$img1 = file_get_contents('1.jpg'); 7$img2 = file_get_contents('2.jpg'); 8$img3 = file_get_contents('3.jpg'); 9 10$data = [ 11 'text1' => 'ほげ', 12 'text2' => 'ふが', 13 'bool1' => true, 14 'boo2' => false, 15 'int1' => 3, 16 'int2' => 1234567890, 17 'float1' => 4.568, 18 'float2' => 789.0123456, 19 'array1' => ['ふが', 11], 20 'array2' => ['ピヨ', true, false, 123, 456.789], 21 '1.jpg' => $img1, 22 '2.jpg' => $img2, 23 '3.jpg' => $img3 24]; 25 26$packer = new Packer(); 27$res = $packer ->packMap($data); 28echo $res; 29?>

Android側
AndroidのMessagePackライブラリのインストールはbandle.gradle(Module: app)のdependenciesにcompileの行を追加し、syncさせればインストールされます。
bandle.gradle(Module: app)

java

1dependencies { 2 compile 'org.msgpack:msgpack-core:0.8.12' // この行を追加 3}

activity_main.xml

xml

1<?xml version= "1.0" encoding= "utf-8" ?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:id="@+id/activity_main" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 android:paddingBottom="@dimen/activity_vertical_margin" 9 android:paddingLeft="@dimen/activity_horizontal_margin" 10 android:paddingRight="@dimen/activity_horizontal_margin" 11 android:paddingTop="@dimen/activity_vertical_margin" 12 tools:context="com.example.ritto.myapplication.MainActivity"> 13 14 <ScrollView 15 android:layout_width="match_parent" 16 android:layout_height="match_parent" 17 android:layout_alignParentLeft="true" 18 android:layout_alignParentStart="true" 19 android:layout_alignParentTop="true" 20 android:clipToPadding="false" 21 tools:ignore="UselessParent"> 22 23 <LinearLayout 24 android:id="@+id/layout" 25 android:layout_width="match_parent" 26 android:layout_height="wrap_content" 27 android:orientation="vertical"> 28 29 <Button 30 android:id="@+id/button" 31 android:layout_width="match_parent" 32 android:layout_height="wrap_content" 33 android:text="HTTPデータ取得" 34 tools:ignore="HardcodedText" /> 35 36 <TableLayout 37 android:id="@+id/table" 38 android:layout_width="match_parent" 39 android:layout_height="match_parent" 40 android:stretchColumns="0,1"> 41 42 </TableLayout> 43 44 </LinearLayout > 45 </ScrollView > 46</RelativeLayout >

MainActivity.java

java

1package com.example.xxx.myapplication; //張り付けた後自分のパッケージ名に修正する 2 3import android.graphics.Bitmap; 4import android.graphics.BitmapFactory; 5import android.os.Handler; 6import android.support.v7.app.AppCompatActivity; 7import android.os.Bundle; 8import android.view.View; 9import android.widget.Button; 10import android.widget.ImageView; 11import android.widget.TableLayout; 12import android.widget.TableRow; 13import android.widget.TextView; 14 15import org.msgpack.core.MessagePack; 16import org.msgpack.value.ArrayValue; 17import org.msgpack.value.ExtensionValue; 18import org.msgpack.value.FloatValue; 19import org.msgpack.value.ImmutableValue; 20import org.msgpack.value.IntegerValue; 21import org.msgpack.value.Value; 22import org.msgpack.value.ValueType; 23import java.math.BigInteger; 24import java.net.HttpURLConnection; 25import java.net.URL; 26import java.util.Map; 27 28public class MainActivity extends AppCompatActivity { 29 30 @Override 31 protected void onCreate(Bundle savedInstanceState) { 32 super.onCreate(savedInstanceState); 33 setContentView(R.layout.activity_main); 34 35 Button btn = (Button) findViewById(R.id.button); 36 final TableLayout table = (TableLayout) findViewById(R.id.table); 37 final Handler handler = new Handler(); 38 39 btn.setOnClickListener(new View.OnClickListener() { 40 @Override 41 public void onClick(View v) { 42 table.removeAllViews(); 43 new Thread(new Runnable() { 44 @Override 45 public void run() { 46 try { 47 URL url = new URL("http://10.0.2.2/msgpack_test.php"); 48 HttpURLConnection con = (HttpURLConnection) url.openConnection(); 49 final ImmutableValue iv = MessagePack.newDefaultUnpacker(con.getInputStream()).unpackValue(); 50 51 handler.post(new Runnable() { 52 @Override 53 public void run() { 54 for (Map.Entry < Value, Value > kv : iv.asMapValue().entrySet()) { 55 kv.getValue().getValueType(); 56 Value key = kv.getKey(); 57 Value val = kv.getValue(); 58 59 TableRow row = new TableRow(MainActivity.this); 60 table.addView(row); 61 TextView keyView = new TextView(MainActivity.this); 62 keyView.setText(key.toString()); 63 row.addView(keyView); 64 View valView; 65 if (val.getValueType() == ValueType.BINARY) { 66 valView = new ImageView(MainActivity.this); 67 ((ImageView) valView).setLayoutParams(new TableRow.LayoutParams(200, 200)); 68 } else { 69 valView = new TextView(MainActivity.this); 70 } 71 72 row.addView(valView); 73 74 switch (val.getValueType()) { 75 case NIL: 76 keyView.setText(key.toString() + " [Null]"); 77 ((TextView) valView).setText(val.toString()); 78 break; 79 case BOOLEAN: 80 boolean b = val.asBooleanValue().getBoolean(); 81 keyView.setText(key.toString() + " [Boolean]"); 82 ((TextView) valView).setText(b ? "true" : "false"); 83 break; 84 case INTEGER: 85 IntegerValue intVal = val.asIntegerValue(); 86 if (intVal.isInIntRange()) { 87 int i = intVal.toInt(); 88 keyView.setText(key.toString() + " [int]"); 89 ((TextView) valView).setText(String.valueOf(i)); 90 } else if (intVal.isInLongRange()) { 91 long l = intVal.toLong(); 92 keyView.setText(key.toString() + " [long]"); 93 ((TextView) valView).setText(String.valueOf(l)); 94 } else { 95 BigInteger i = intVal.toBigInteger(); 96 keyView.setText(key.toString() + " [BigInteger]"); 97 ((TextView) valView).setText(String.valueOf(i)); 98 } 99 break; 100 case FLOAT: 101 FloatValue fv = val.asFloatValue(); 102 //float f = fv.toFloat(); // use as float 103 double d = fv.toDouble(); // use as double 104 keyView.setText(key.toString() + " [float/double]"); 105 ((TextView) valView).setText(String.valueOf(d)); 106 break; 107 case STRING: 108 String s = val.asStringValue().asString(); 109 keyView.setText(key.toString() + " [String]"); 110 ((TextView) valView).setText(s); 111 break; 112 case BINARY: 113 byte[] mb = val.asBinaryValue().asByteArray(); 114 // Binaryは画像前提 115 Bitmap bmp = BitmapFactory.decodeByteArray(mb, 0, mb.length); 116 keyView.setText(key.toString() + " [Bitmap]"); 117 ((ImageView) valView).setImageBitmap(bmp); 118 break; 119 case ARRAY: 120 ArrayValue a = val.asArrayValue(); 121 keyView.setText(key.toString() + " [Array]"); 122 StringBuilder sb = new StringBuilder(); 123 sb.append("["); 124 String spl = ""; 125 for (Value e : a) { 126 sb.append(spl + e); 127 spl = ", "; 128 } 129 sb.append("]"); 130 ((TextView) valView).setText(sb.toString()); 131 break; 132 case EXTENSION: 133 ExtensionValue ev = val.asExtensionValue(); 134 byte extType = ev.getType(); 135 byte[] extValue = ev.getData(); 136 keyView.setText(key.toString() + " [Extension(" + String.valueOf(extType) + ")]"); 137 ((TextView) valView).setText(String.valueOf(extValue)); 138 break; 139 } 140 } 141 } 142 }); 143 } catch (Exception ex) { 144 System.out.println(ex); 145 } 146 } 147}).start(); 148 } 149 }); 150 } 151}

イメージ説明

投稿2017/03/07 00:30

編集2017/03/07 03:29
turbgraphics200

総合スコア4267

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

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

0

ベストアンサー

サーバで画像をbese64にエンコードして、文字列と一緒にjson化して、クライアント側でbese64をデコードして画像を読むという方法はどうでしょうか。これならGET通信だけでいけます。

投稿2017/03/04 02:54

編集2017/03/04 03:08
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takg

2017/03/04 03:57

ご回答ありがとうございます。 base64エンコードの場合、データ量が増えることによる支障が出ないか気になっています。 別の方がmultipart/form-dataを用いた方法について言及されていたのですが、 どちらの手法がより一般的なのでしょうか?
退会済みユーザー

退会済みユーザー

2017/03/04 04:19

軽量の画像ならbese64にしてしまって送っても大丈夫かなと思います。 割りと大きめの画像なら画像のurlのみをjsonに記載する方が一般的かと。github等の有名なapiだとそんな感じですね。
takg

2017/03/04 07:52

現在DBに画像を保存しているので、やはりbase64を使う方向で試してみようと思います。 処理の重さが気になるようならサーバのフォルダに画像を配置して、 仰るようなURLを渡す方法に移行しようと思います。 ご助言ありがとうございました。
guest

0

データやヘッダーをmultipart/form-dataに準拠するように修正する必要があります。
おそらく今のコードに加筆するというのは難しいです。一度multipart/form-dataについて調べて、実装したあとに再度質問した方がいいですよ。

投稿2017/03/03 11:59

yona

総合スコア18155

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

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

takg

2017/03/04 07:46

ありがとうございます。 仰る手法について調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問