반응형
스프링 서버에 안드로이드의 파일 이미지를 보내보자.
스프링 서버 파일 업로드는 [빠르게보는]스프링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
반응형
'Android' 카테고리의 다른 글
[빠르게 보는] 안드로이드 파일선택 (0) | 2019.07.02 |
---|---|
안드로이드에서 JSON을 이용해 서버와 데이터 주고 받기 (60) | 2013.06.08 |
안드로이드에서 16진수 컬러 쓰는 법 (0) | 2013.05.27 |
GridView 설정 (0) | 2013.05.27 |
EditText 개행 문자 웹 DB 저장 법 (0) | 2013.05.23 |
WRITTEN BY
,