お世話になっております。
現在,Android端末のストレージから画像をuploadする機能を作成しています。
サーバ側が独自のmultipart形式を受け入れる仕様になっているため,
書式が正しければ画像がuploadされるはずなのですが,
connection.getResponseMessage()でレスポンスを見ると
Required MultipartFile parameter 'file' is not present
というエラーが返ってきます。(外部ストレージへの接続はできているようです。)
なので,POSTした時のリクエスト内容を確認したいのですが,
javaでリクエストヘッダやボディをprotocolの表記形式(このサイトのような表記形式)に近い形で見る方法はあるでしょうか。(送信前にヘッダが見れるのは知っています。bodyは文字列格納してからencodeすればencode時の文字列で確認できるのもわかります。実際に送られているリクエストがプロトコル形式でどうなっているか見る方法があるかないか知りたいという意味です。)
リクエスト内容が確認できれば,自力で直せるとは思うので,(リファクタリング前の酷いコードなのもあり)載せる必要はあまりないかもしれませんが念のため,コードを載せます。
以下のようにoutputstreamに書き込まれているデータを読み出せればいいのですが,どうやってデバッグするのがいいでしょうか。
普段javaでコードを書かないため,くだらない質問かもしれませんが,経験がある方アドバイスいただければと思います。
class UploadImage extends AsyncTask<URL, Void, String> {
Context c;
public UploadImage(Context c)
super()
this.c = c;
}
protected String doInBackground(URL... url) {
uploadImage(this.c);
return "";
}
void uploadImage(Context c){
File destDir = new File(Environment.getExternalStorageDirectory().
getPath() + "/my_images/");
File[] files = destDir.listFiles();
String uri = "https://hogehoge.com";
String base64_pass = "my_base64";
for (int i = 0;i<files.length;i++) {
try {
sendMultipart(uri, base64_pass, files[i]);
} catch (Exception e) {
// Toast.makeText(c, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
private void sendMultipart(String uri,String password, File file) throws IOException {
URL url = new URL(uri);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
final String twoHyphens = "--";
final String boundary = twoHyphens+"*****"+ UUID.randomUUID().toString()+"*****";
final String lineEnd = "\r\n";
final int maxBufferSize = 1024*1024*3;
String filefield = "file";
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Authorization(独自のproperty)", password);
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary);
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes(boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() +"\"" + lineEnd);
outputStream.writeBytes("Content-Type: application/octet-stream" + lineEnd);
outputStream.writeBytes(lineEnd);
FileInputStream fileInputStream = new FileInputStream(file);
int bytesAvailable = fileInputStream.available();
int bufferSize = Math.min(bytesAvailable, maxBufferSize);
byte[] buffer = new byte[bufferSize];
int bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while(bytesRead > 0) {
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(boundary + twoHyphens + lineEnd);
if( connection.getResponseCode() == HttpURLConnection.HTTP_OK ){
//log に成功した旨を記載
}else{
//logに失敗した旨を記載
Log.e("ERROR",connection.getResponseMessage())
}
connection.close();
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
リクエストした内容がエンドポイントで確認できるrequestbinというサービスをみつけ正常なリクエストと内容を比較することで解決することができました。
リクエスト内容に微妙な脱字があったため,リクエストが通らなかったことが判明しました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
HTTP本文が正しくマルチパートで送信できているかのバリデーションも通過するように自前で作っていくのは結構な手間かと思います。
もしすでに実行済みで動かなかったら申しわけないのですが、マルチパートもHTTP送受信できる Commons-HTTPComponentという、JavaがらHTTPクライアントを動作させるためのライブラリが提供されています。
この例(http://hc.apache.org/httpcomponents-client-4.5.x/httpmime/examples/org/apache/http/examples/entity/mime/ClientMultipartFormPost.java)のように、マルチパートでの送信について書いてあるサンプルもありますので、参考にされてはいかがでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる