OKHttp3によるアップロード

Androidからサーバーへのアップロードがやりたくて2、3日苦労しました。

ボタンを押すとhtmlファイルをサーバーにアップロードするプログラム

GalleryActivity.java

package jp.wpblog.valletta.galleryactivity;
        import android.os.AsyncTask;
        import android.os.Bundle;
        import android.support.v7.app.AppCompatActivity;
        import android.util.Log;
        import android.view.View;
        import android.widget.Button;
        import android.widget.TextView;
        import java.io.IOException;
        import okhttp3.Headers;
        import okhttp3.MediaType;
        import okhttp3.MultipartBody;
        import okhttp3.OkHttpClient;
        import okhttp3.Request;
        import okhttp3.RequestBody;
        import okhttp3.Response;

        public class GalleryActivity extends AppCompatActivity implements View.OnClickListener {
        private String TAG = "jp.wpblog.valletta.galleryactivity";
        private Button mpickButton;
        private TextView mtextView;
        int RESULT_PICK_FILENAME = 1;
              @Override
        protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_gallery);
                Button pickButton = (Button)findViewById(R.id.pickButton);
                pickButton.setOnClickListener(this);
                mpickButton = pickButton;
                TextView textView = (TextView)findViewById(R.id.textView);
                mtextView = textView;
            }
       public void onClick(View v) {
                switch(v.getId()){
                        case R.id.pickButton:
                                getRequestWithPOST((Button)v);
                                break;
                    }
            }
        public void getRequestWithPOST(final Button button) {
            button.setEnabled(false);
                new AsyncTask<Void, Void, String>() {
                        @Override
                        protected String doInBackground(Void... params) {
                                String result = null;
                                // リクエストボディを作る
                                final MediaType TEXT = MediaType.parse("text/plain; charset=utf-8");
                                final String BOUNDARY = String.valueOf(System.currentTimeMillis());

                            RequestBody requestBody = new MultipartBody.Builder(BOUNDARY).setType(MultipartBody.FORM)
                                    .addPart(Headers.of("Content-Disposition", "form-data; name=\"category\""),
                                            RequestBody.create(TEXT, "GAME")
                                    ).addFormDataPart("upfile", "upfile.html", RequestBody.create(MediaType.parse("text/plain; charset=SJIS"),
                                            "<HTML>\n" +
                                                    " <HEAD>\n" +
                                                    " <TITLE>タイトル</TITLE>\n" +
                                                    " </HEAD>\n" +
                                                    " <BODY>\n" +
                                                    " ボディ\n" +
                                                    " </BODY>\n" +
                                                    " </HTML>"))
                                    .build();
                            // リクエストオブジェクトを作って
                            Request request = new Request.Builder()
                                    .url("http://???.???.jp/php/upload.php")
                                    .post(requestBody)
                                    .build();
                                // クライアントオブジェクトを作る。
                               OkHttpClient client = new OkHttpClient();
                                // 実行。リクエストして結果を受け取る。
                                try {
                                        Response response = client.newCall(request).execute();
                                        result = response.body().string();
                                    } catch (IOException e) {
                                        e.printStackTrace();
                                    }
                                // 返す
                                return result;
                            }
                            @Override
                            protected void onPostExecute(String result) {
                                    button.setEnabled(true);
                                mtextView.setText(result);
                                Log.d(TAG, result);
                            }
                    }.execute();
            }
    }

activity_gallery.xml

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent" android:layout_height="match_parent">
      <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Pick File from Gallery"
           android:id="@+id/pickButton"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/pickButton"
            android:text=""
            android:id="@+id/textView"/>
    </RelativeLayout>

manifest.xml

<uses-permission android:name="android.permission.INTERNET" />

build.gradle(app)

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.+'
    compile 'com.squareup.okhttp3:okhttp:3.3.1'
}

参考にしたサイト:http://wiki.toridge.com/index.php?android-%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89(okHttp3)

そしてサーバー側のphpにまた苦労。

wordpressではうまくいかず別のページを開設しました。

(その間にwordpressが立ち上がらなくなり苛々、やっと復旧)

<?php
if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
  if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "files/" . "upfile.html")) {
    chmod("files/" . "upfile.html", 0644);
    echo $_FILES["upfile"]["name"] . "をアップロードしました。";
  } else {
        // $_FILES['upfile']['error'] の値を確認
        switch ($_FILES['upfile']['error']) {
            case UPLOAD_ERR_OK: // OK
                break;
            case UPLOAD_ERR_NO_FILE:   // ファイル未選択
                $msg = 'ファイルが選択されていません';
            case UPLOAD_ERR_INI_SIZE:  // php.ini定義の最大サイズ超過
                $msg = 'ファイルサイズが大きすぎます UPLOAD_ERR_INI_SIZE';
            case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過
                $msg = 'ファイルサイズが大きすぎます UPLOAD_ERR_FORM_SIZE';
                break;
            default:
                $msg = 'その他のエラーが発生しました';
        }
        echo $msg;
    }
} else {
        // $_FILES['upfile']['error'] の値を確認
    switch ($_FILES['upfile']['error']) {
            case UPLOAD_ERR_OK: // OK
                break;
            case UPLOAD_ERR_NO_FILE:   // ファイル未選択
                $msg = 'ファイルが選択されていません';
            case UPLOAD_ERR_INI_SIZE:  // php.ini定義の最大サイズ超過
                $msg = 'ファイルサイズが大きすぎます UPLOAD_ERR_NO_FILE';
                break;
            case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過
                $msg = 'ファイルサイズが大きすぎます UPLOAD_ERR_FORM_SIZE';
                break;
            default:
                $msg = 'その他のエラーが発生しました';
    }
        echo $msg;
}

ようやっと大きな山を越えた感じ!

Follow me!