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

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

ただいまの
回答率

90.34%

  • PHP

    21290questions

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

  • Java

    14396questions

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

  • HTTP

    567questions

    HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

  • POST

    240questions

    POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

JavaのマルチパートPOSTを使ってファイルを送信したい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,661

YuzuTea

score 16

サーバーをPHPで書いてそのサーバーにファイルをポストするJAVAプログラムを下記を参考(ほぼコピペして)に書いたの
http://androidnote.logdown.com/posts/152809-http-messenger
うまくファイルをPOSTできません。

当方プログラミング初心者でJavaはそもそも苦手で全く詳しくありません。
誰か助けていただけないでしょうか...?
できないというのは、ファイルがサーバーにアップロードされないと言う意味です。
サーバーにアップロードされないのはどうやって気がついたかと言うと
ステータスが500で帰ってきたからです。

ちなみにURLとファイル名はしっかり入力しました。
よろしくお願いいたします。

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Main {

  public static void main(String[] args){
      sendData("URL","ファイル名");
  }


    public static void sendData(String api, String filename) {

        HttpURLConnection connection = null;
        DataOutputStream outputStream = null;

        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";

        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024;

        try {
            // サーバへの接続開始
            URL url = new URL(api);
            connection = (HttpURLConnection) url.openConnection();

            connection.setDoInput(true);
            connection.setDoOutput(true);

            // キャッシュを使用しない
            connection.setUseCaches(false);

            connection.setRequestMethod("POST");
            // HTTP/1.1 でサポートされた持続接続機能が使用できることを宣言する
            connection.setRequestProperty("Connection", "Keep-Alive");

            // マルチパートデータとして複数のデータを送ることを宣言する
            connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

            StringBuilder builder = new StringBuilder();
            builder.append(twoHyphens + boundary + lineEnd);
            builder.append("Content-Disposition: form-data; name=\"id\"" + lineEnd);
            builder.append(lineEnd);
            builder.append(lineEnd);
            builder.append(twoHyphens + boundary + lineEnd);
            builder.append("Content-Disposition: form-data; name=\"password\"" + lineEnd);
            builder.append(lineEnd);
            builder.append(lineEnd);
            builder.append(twoHyphens + boundary + lineEnd);
            builder.append("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + filename + "\"" + lineEnd);
            builder.append(lineEnd);
            File file = new File(filename);
            FileInputStream fileInputStream = new FileInputStream(file);
            StringBuilder lastbuilder = new StringBuilder();
            lastbuilder.append(lineEnd + twoHyphens + boundary + twoHyphens + lineEnd);

            // 内部バッファ処理を行わずに HTTP 要求本体のストリーミングを有効にする
            connection.setChunkedStreamingMode(0);

            // setFixedLengthStreamingMode をつかう場合
            // Content-length を算出する
            // int contentLength = (int) (builder.toString().getBytes().length
            // + lastbuilder.toString().getBytes().length
            // + file.length());
            // connection.setFixedLengthStreamingMode(contentLength);

            outputStream = new DataOutputStream(connection.getOutputStream());
            outputStream.writeBytes(builder.toString());

            // ファイルを一定サイズ毎読み書きする
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];
            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(lastbuilder.toString());

            String result = "";

            // 成功ならレスポンスボディをそのまま表示する
            if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
                String line = null;
                while ((line = br.readLine()) != null) {
                    result += line + "\n";
                }
            } else {
                result = "Server error is occured";
            }

            try {
                fileInputStream.close();
                outputStream.flush();
                outputStream.close();
                connection.disconnect();
            } catch (Exception e) {
                // Android 2.2 以下だと flush() あたりで java.io.IOException: Stream is
                // closed が発生するが、ファイルは無事に届いているはず。
                // Default buffer size used in BufferedReader constructor. It
                // would be better to be explicit if an 8k-char buffer is
                // required. が関係しているような気がする。
                e.printStackTrace();
            }



            System.out.println(result);
        } catch (FileNotFoundException e) {

        } catch (Exception ex) {

        }
    }
}
<?php

require_once "twitter.php";

$domain  = empty($_SERVER["HTTPS"]) ? "http://" : "https://";
$domain .= $_SERVER["HTTP_HOST"];
$postName = "upload";
$response = array();

if (is_uploaded_file($_FILES[$postName]['tmp_name'])) {
    if (move_uploaded_file($_FILES[$postName]['tmp_name'],"./upload/".$_FILES[$postName]['name'])) {
        $response['status']  = 200;
        $response['message'] = "uploaded";
        $response['twitter'] = tweetUpfile( $domain . "/upload/" . $_FILES[$postName]['name']);
    } else {
        $response['status'] = 500;
        $response['message'] = "error while saving.";
    }
} else {
    $response['status'] = 500;
    $response['message'] = "file not uploaded.";
}

header('Content-Type: application/json');
echo json_encode($response);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • yona

    2017/02/14 15:54

    なぜ同じ質問を再投稿したのでしょうか?前の質問は解決していないですよね?

    キャンセル

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

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    21290questions

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

  • Java

    14396questions

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

  • HTTP

    567questions

    HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

  • POST

    240questions

    POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。