반응형

스프링 서버에 안드로이드의 파일 이미지를 보내보자.
스프링 서버 파일 업로드는 [빠르게보는]스프링5 / 스프링부트 파일 업로드을 참고하자.
안드로이드 이미지 선택은 [빠르게 보는] 안드로이드 파일선택을 기반으로 만들어졌다.

Dependency 추가

  • File > Project Structure > modules 내부 > app 클릭 > Declared Dependencies 탭 내부 '+' 버튼 클릭 > Library Dependency 클릭
  • com.squareup.okhttp3 검색
  • Artifact Name > okhttp 선택 > Versions 영역에서 3.4.2 버전 선택 > OK 버튼 클릭

AndoridManifest.xml 권한 및 예외 설정

  • 인터넷 / 저장소 사용 권한과 usesCleartextTraffic 을 True로 하자.

    <application
          ...
          android:usesCleartextTraffic="true"
          ...>
          <activity android:name=".MainActivity">
             ...
          </activity>
      </application>
    
      <uses-permission android:name="android.permission.INTERNET" android:required="true"/>
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:required="true"/>

activity_main.xml

  • 특별한건 없고, 이미지 선택과 선택한 이미지를 보여주는 이미지 뷰, 그리고 보내기 버튼이다.

    <?xml version="1.0" encoding="utf-8"?>
    <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:context=".MainActivity">
    
      <Button
          android:id="@+id/btnImageSend"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginEnd="4dp"
          android:layout_x="3dp"
          android:layout_y="681dp"
          android:text="보내기"
          app:layout_constraintEnd_toEndOf="parent"
          tools:layout_editor_absoluteY="667dp" />
    
      <Button
          android:id="@+id/btnImageSelection"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_x="316dp"
          android:layout_y="682dp"
          android:text="이미지 선택"
          tools:layout_editor_absoluteX="8dp"
          tools:layout_editor_absoluteY="667dp" />
    
      <ImageView
          android:id="@+id/imgVwSelected"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_marginStart="8dp"
          android:layout_marginEnd="8dp"
          android:layout_x="0dp"
          android:layout_y="0dp"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          tools:layout_editor_absoluteY="13dp"
          tools:srcCompat="@tools:sample/backgrounds/scenic" />
    

MainActivity.java

  • UI 매핑과 on 이벤트 매핑, 그리고 이미지 선택 Intent의 Result 처리를 한다.

  • 경로를 얻어서 보내도 되지만, 선택한 파일을 임시로 저장하여 보내는 방식을 선택했다.

    package com.derveljun.fileupload;
    
    import android.content.Intent;  
    import android.database.Cursor;  
    import android.graphics.Bitmap;  
    import android.graphics.BitmapFactory;  
    import android.net.Uri;  
    import android.os.Environment;  
    import android.provider.MediaStore;  
    import android.support.v4.content.FileProvider;  
    import android.support.v7.app.AppCompatActivity;  
    import android.os.Bundle;  
    import android.view.View;  
    import android.widget.Button;  
    import android.widget.ImageView;  
    import android.widget.Toast;
    
    import java.io.File;  
    import java.io.FileOutputStream;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.io.OutputStream;  
    import java.text.SimpleDateFormat;  
    import java.util.Date;
    
    public class MainActivity extends AppCompatActivity {
    
      ImageView imgVwSelected;
      Button btnImageSend, btnImageSelection;
      File tempSelectFile;
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
    
          btnImageSend = findViewById(R.id.btnImageSend);
          btnImageSend.setEnabled(false);
          btnImageSend.setOnClickListener(new View.OnClickListener(){
              @Override
              public void onClick(View view){
                  FileUploadUtils.send2Server(tempSelectFile);
              }
          });
    
          btnImageSelection = findViewById(R.id.btnImageSelection);
          btnImageSelection.setOnClickListener(new View.OnClickListener(){
              @Override
              public void onClick(View view){
                  // Intent를 통해 이미지를 선택
                  Intent intent = new Intent();
                  // intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                  intent.setType("image/*");
                  intent.setAction(Intent.ACTION_GET_CONTENT);
                  startActivityForResult(intent, 1);
              }
          });
    
          imgVwSelected = findViewById(R.id.imgVwSelected);
      }
    
      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data){
          if (requestCode != 1 || resultCode != RESULT_OK) {
              return;
          }
    
          Uri dataUri = data.getData();
          imgVwSelected.setImageURI(dataUri);
    
          try {
              // ImageView 에 이미지 출력
              InputStream in = getContentResolver().openInputStream(dataUri);
              Bitmap image = BitmapFactory.decodeStream(in);
              imgVwSelected.setImageBitmap(image);
              in.close();
    
              // 선택한 이미지 임시 저장
              String date = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss").format(new Date());
              tempSelectFile = new File(Environment.getExternalStorageDirectory()+"/Pictures/Test/", "temp_" + date + ".jpeg");
              OutputStream out = new FileOutputStream(tempSelectFile);
              image.compress(Bitmap.CompressFormat.JPEG, 100, out);
          } catch(IOException ioe) {
              ioe.printStackTrace();
          }
    
          btnImageSend.setEnabled(true);
      }
      }

FileUploadUtils.java

  • OkHttp 3.4.2 를 기반으로 만들었다.

  • 사소한 꿀팁으로는 휴대폰 테더링으로 노트북을 잡으면, 휴대폰이 마스터 Network이기 때문에 IP를 할당한 노트북 IP로 접근이 가능하다.

    
      package com.derveljun.fileupload;
    
      import android.util.Log;
    
      import java.io.File;  
      import java.io.IOException;
    
      import okhttp3.Call;  
      import okhttp3.Callback;  
      import okhttp3.MultipartBody;  
      import okhttp3.OkHttpClient;  
      import okhttp3.Request;  
      import okhttp3.RequestBody;  
      import okhttp3.Response;
    
      public class FileUploadUtils {  
        public static void send2Server(File file){  
            RequestBody requestBody = new MultipartBody.Builder()  
              .setType(MultipartBody.FORM)  
              .addFormDataPart("files", file.getName(), RequestBody.create(MultipartBody.FORM, file))  
              .build();
            Request request = new Request.Builder()
                    .url("http://192.168.43.221:18080/upload") // Server URL 은 본인 IP를 입력
                    .post(requestBody)
                    .build();
    
            OkHttpClient client = new OkHttpClient();
            client.newCall(request).enqueue(new Callback() {
    
                @Override
                public void onFailure(Call call, IOException e) {
                    e.printStackTrace();
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Log.d("TEST : ", response.body().string());
                }
            });
        }
      }
    

블로그내 예제 Git

반응형

WRITTEN BY
데르벨준

,