Android Coding

OkHttp3을 활용한 Multipart Image 전송

오마로 2017. 3. 24. 18:50
반응형


이미지 파일 전송을 1개씩 다중으로 보내는 프로세스를 적용했었는데,

한번에 다중으로 보내는 필요성이 있어서 Okhttp를 적용하기로 함..


그냥 httpclient를 사용해도 되는데, 그래도 okhttp를 사용해보고 싶어서 ^^



1.okttp 적용

  - 2017.03.24 기준으로 최신 com.squareup.okhttp3:okhttp:3.6.0 적용

  http://square.github.io/okhttp/


dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.squareup.okhttp3:okhttp:3.6.0'
}


2.적용 소스

public class TestMultPartActivity extends Activity {
private static final String TAG = TestMultPartActivity.class.getSimpleName();
private static final int XML_LAYOUT = R.layout.activity_loading;
private TestMultPartActivity mLoadingActivity;

private String mFilePath01;
private String mFilePath02;

@Override
protected void onCreate(Bundle savedInstanceState) {
GomsLog.d(TAG, "LoadingActivity onCreate");
super.onCreate(savedInstanceState);
setContentView(XML_LAYOUT);

mLoadingActivity = this;

mFilePath01 = Environment.getExternalStorageDirectory().getAbsolutePath() + "/StoreCamera/StoreCameraPhoto/storecamera_20170324110107_0.jpg";
mFilePath02 = Environment.getExternalStorageDirectory().getAbsolutePath() + "/StoreCamera/StoreCameraPhoto/storecamera_20170324105951_0.jpg";
goSend();
}

private void goSend(){
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("title", "STORE Camera")
.addFormDataPart("origianl_photo","origianl_photo.jpg", RequestBody.create(MultipartBody.FORM, new File(mFilePath01)))
.addFormDataPart("guide_photo","guide_photo.jpg", RequestBody.create(MultipartBody.FORM, new File(mFilePath02)))
.build();

Request request = new Request.Builder()
.url("https://....../multipart_test.php")
.post(requestBody)
.build();

OkHttpClient client = new OkHttpClient();

client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {

}

@Override
public void onResponse(Call call, Response response) throws IOException {
GomsLog.d(TAG, "onResponse: " + response.body().string());
}
});
}

}


2-1.RequestBody  생성


RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("title", "STORE Camera")
.addFormDataPart("original_photo","original_photo.jpg", RequestBody.create(MultipartBody.FORM, new File(mFilePath01)))
.addFormDataPart("guide_photo","guide_photo.jpg", RequestBody.create(MultipartBody.FORM, new File(mFilePath02)))
.build();

변수명 : original_photo, 서버저장파일명 : original_photo.jpg 그리고, 파일 첨부


2-2.Request 생성

Request request = new Request.Builder()
.url("https://......./multipart_test.php")
.post(requestBody)
.build();

보낼 url과 requestBody 지정


2-3. Client 생성 및 Callback

OkHttpClient client = new OkHttpClient();

client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(okhttp3.Call call, IOException e) {

}

@Override
public void onResponse(Call call, Response response) throws IOException {
GomsLog.d(TAG, "onResponse: " + response.body().string());
}
});


3.서버 작업

  multipart_test.php 소스에 파일 수신 및 생성 처리를 하면 끝...


  3-1.서버 간략 소스 처리

       안드로이드에서 지정한 변수명 original_photo를 지정해서 파일 처리.

if($_FILES['original_photo']['name']){
//파일명
$org_file = $_FILES['original_photo']['name'];
$temp_mem = explode(".",$org_file);
//확장자
$file_expt = $temp_mem[1];
//진행상태변수
$flow_state = "0";
//return변수
$message = "";

//파일명확인을 위한 변수
$filename_fix_yn = "0";
//저장하기 위한 파일명 변수
$fix_filename = "";
//파일명 확장을 위한 변수
$fix_i = 0;
//3. 파일명 중복검사및처리
if($flow_state == "0"){
$fix_filename = $temp_mem[0];
while($filename_fix_yn == "0")
{
$fix_i++;
if(file_exists( $save_root.$fix_filename . "." . $file_expt)){
$fix_filename = $temp_mem[0] . "(" . $fix_i . ")";
$filename_fix_yn = "0";
}else{
$filename_fix_yn = "1";
$fix_filename = $fix_filename . "." . $file_expt;
}
}
}
move_uploaded_file($_FILES['original_photo']['tmp_name'], $save_root.$fix_filename);
echo $save_root.$fix_filename;
}


참 쉽죠잉~ ^^;

안드로이드와 서버 프로그램을 동시에 하는 것은 참 어렵죠잉~ ^^;


다들 즐프되세요...

반응형