이미지 파일 전송을 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;
}
참 쉽죠잉~ ^^;
안드로이드와 서버 프로그램을 동시에 하는 것은 참 어렵죠잉~ ^^;
다들 즐프되세요...
'Android Coding' 카테고리의 다른 글
[앨범]사진 다중 선택을 할 때, 이상하게 의도치 않은 checkbox checked 될 때.. (0) | 2017.06.15 |
---|---|
Parcelable을 사용한 Object Array 전달 (0) | 2017.05.31 |
실시간 permission 처리 최종 #3 (0) | 2017.03.22 |
실시간 permission 처리 #2 (0) | 2017.03.17 |
Activity Intent Flag 참조글 (0) | 2017.03.13 |