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

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

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

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

Android

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

Q&A

解決済

1回答

1065閲覧

Androidで画像とテキストを送る「マルチパート送信」について教えてください

KumaChan

総合スコア37

Java

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

Android

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

0グッド

0クリップ

投稿2018/11/15 07:09

編集2018/11/21 05:03

Androidで画像とテキストを同時に送る「マルチパート送信」の練習をしています。
teratailやQiitaなどで情報を集め、自分なりに以下のようなソースを書いてみました。
…が、ちょっとあいまいなところもあるので、確認の意味も含めて質問をさせてください。

public class PhotoTextSender extends AsyncTask<String, String, Integer> { HttpURLConnection con; DataOutputStream dos; URL url; Integer res; String text = "あいうえお"; String breaks = "\r\n"; String hyphens = "--"; String boundary = "*****"; @Override protected Integer doInBackground(String... para) { // URLを取得 try { url = new URL(para[0]); } catch (MalformedURLException e) { e.printStackTrace(); } // 画像をバイト配列に ByteArrayOutputStream bos = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 100, bos); try { // 通信の準備 con = (HttpURLConnection) url.openConnection(); con.setConnectTimeout(5000); con.setReadTimeout(5000); con.setRequestMethod("POST"); con.setRequestProperty("Connection", "Keep-Alive"); con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); con.setRequestProperty("Accept-Charset", "UTF-8"); con.setUseCaches(false); con.setDoOutput(true); // 出力ストリームを生成 dos = new DataOutputStream( con.getOutputStream()); // 出力ストリームにファイルを書き込み dos.writeBytes(breaks + hyphens + boundary + breaks); dos.writeBytes("Content-Disposition: form-data; name=\"upfile\"; filename=\"upfile.jpg\"" + breaks + breaks); dos.write(bos.toByteArray()); dos.writeBytes(breaks + hyphens + boundary + hyphens + breaks); // 出力ストリームにテキストを書き込み dos.writeBytes(hyphens + boundary + breaks); dos.writeBytes("Content-Disposition: form-data; name=\"message\"" + breaks + breaks); // 文字化け対策 byte[] bytes = text.getBytes(); for(int i = 0 ; i < bytes.length; i++){ dos.writeByte(bytes[i]); } // 通信スタート con.connect(); // レスポンスを取得 res = con.getResponseCode(); // 出力を閉じる dos.close(); } catch (IOException e) { e.printStackTrace(); } finally { // 通信を閉じる con.disconnect(); } return res; } public void onPostExecute(Integer res) { // 処理結果 if(res == HttpURLConnection.HTTP_OK){ Toast.makeText(MainActivity.this, "送信に成功しました", Toast.LENGTH_LONG).show(); }else{ Toast.makeText(MainActivity.this, "送信に失敗しました", Toast.LENGTH_LONG).show(); } } }

この中で、writeBytesを使っている個所は「文字列(リクエストヘッダ)を出力ストリームに書き込んでいるから」で、writeを使っている個所は「バイト配列(ファイル)を出力ストリームに書き込んでいるから」という認識で合っていますでしょうか。いろんなサイトを見ていると、リクエストヘッダにはwriteBytesを使い、ファイルデータにはwriteを使っていたので…

コピペプログラマーにならないよう、中身をしっかり理解したいと思います。
先輩方々、ご教授のほど、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

クラスDataOutputStream

自分で調べられなければコピペプログラマーの道を一直線ですよ。
このような場合はリファレンスを見ましょう。

write は FilterOutputStream から継承したものが使われているので、スーパークラスの方も見てください。

シグネチャを見てください。そうすれば何を引数として渡せば良いのか書いてあります。
また詳細の説明も読んでください。

投稿2018/11/21 05:18

Zuishin

総合スコア28656

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

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

KumaChan

2018/11/21 05:33

ご回答ありがとうございます。 公式リファレンスも含め、自分で調べたうえで確信が得られないので質問したのですが… わたしの認識が正しいかどうかについてはご回答いただけないということでしょうか。 公式リファレンスを読めばわかるだろ、と言われればそれまでですが…
Zuishin

2018/11/21 05:35

他人の認識が正しいかどうかわかりません。自分で曖昧だと感じているのなら正しくないと思います。 引数の型については理解していますか?
KumaChan

2018/11/21 05:51

writeがバイト配列を引数に取り、writeBytesが文字列を引数に取ることは理解していますが…そもそもバイト配列の概念があいまいなのかもしれません。他のデータ型と違って抽象的なので理解しづらく…ここで質問するにはまだレベルが低すぎたようです。勉強しなおしてきます。
Zuishin

2018/11/21 06:00

文字列はオブジェクトは、文字データの集合というだけでなく、文字列を扱えるように抽象化されています。 それを実際のデータとして扱うにはシリアル化、あるいはエンコードという作業が必要になります。つまり UTF8 や Shift_JIS といった決まりに従ってバイト配列に直さなければいけません。 このように、文字列を引数にとって書き込むメソッドの方が処理が多いのです。 言葉を変えると、結局ファイルに書き込めるのはバイト配列だけで、文字列を書き込むには変換が必要になります。 よって、文字列とバイト配列では呼び出すメソッドが違います。 どのあたりを迷われているのかわかりませんが、どのメソッドについても、シグネチャで指定された引数を取るようになっているので、引数に合わせてメソッドを選んだという理解でいいと思います。
Zuishin

2018/11/21 06:06

ファイルと書きましたが、ストリームと読んでください。ファイルもネットワークもデータの流れとして一貫したインターフェースで扱えるようストリームとして抽象化されています。
KumaChan

2018/11/21 06:26

なるほど…すべてはバイト配列によって書き込まれるんですね。プログラムの基本中の基本なのに、すっぽり抜け落ちていました。目から鱗のご回答、ありがとうございます。 引数の違いによってメソッドやシグネチャが変わってくるのも考えれば当たり前のことで、なにを迷っていたんだろうという感じです。 こんなグズグズの質問にお付き合いいただき、本当にありがとうございます。また機会がありましたら、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問